OSDN Git Service

マウス計算処理改造
[nlite/nlite.git] / nlite / nlite_commentview.cpp
1 #include "stdafx.h"
2 #include "nlite_include.h"
3
4
5 namespace nlite{
6
7
8         static const UINT_PTR SELL_SPACE_LENGTH = 1;
9         //
10         //\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
11         ///////////////////////////////////////////////////////////////////
12
13         BOOL CChatReadEdit::SetWindowText(LPCTSTR str){
14
15                 return __super::SetWindowText(str);
16                 
17         }
18
19         
20
21         HWND CChatReadEdit::GeneralCreate(HWND hParent,DWORD eventMask,UINT id){
22
23
24                 this->Create(hParent,0,RICHEDIT_CLASS,WS_CHILD | WS_VISIBLE  | WS_CLIPCHILDREN | ES_AUTOVSCROLL | ES_MULTILINE   | ES_READONLY,0,id);
25                 
26                 DWORD dwLangOptons = this->SendMessage(EM_GETLANGOPTIONS,0,0);
27                 dwLangOptons &= ~IMF_DUALFONT;
28                 this->SendMessage(EM_SETLANGOPTIONS,0,(LPARAM)dwLangOptons);
29
30                 
31                 CFont defFont = ::AtlGetDefaultGuiFont();
32                 LOGFONT deflogFont;
33                 defFont.GetLogFont(&deflogFont);
34                 CHARFORMAT2 m_defCharFormat;
35                 this->GetDefaultCharFormat(m_defCharFormat);
36                 CDC cDC = this->GetDC();
37                 int picy = cDC.GetDeviceCaps(LOGPIXELSY);
38                 this->ReleaseDC(cDC.m_hDC);
39                 int point = -MulDiv(deflogFont.lfHeight,72,picy);
40                 int twips = point * 20;
41                 m_defCharFormat.yHeight = twips;
42                 _tcscpy(m_defCharFormat.szFaceName,deflogFont.lfFaceName);
43                 this->SetEventMask(eventMask);
44                 
45         this->SetDefaultCharFormat(m_defCharFormat);
46
47
48                 return *this;
49
50         }
51
52         CChatChildCtrls::CChatChildCtrls(CCommentView &hMaster):
53         m_master(hMaster)
54         {
55                 
56                 return;
57         }
58
59         
60
61         VOID CChatChildCtrls::Create(){
62
63                 this->chatDispCtrl.GeneralCreate(m_master.m_commentListWindow,ENM_LINK  | ENM_MOUSEEVENTS,CHAT_DISPCTRL_ID);
64
65         }
66
67         VOID CChatChildCtrls::AdjustRect(RECT &rc){
68
69                 rc.left += SELL_SPACE_LENGTH;
70                 rc.top += SELL_SPACE_LENGTH;
71                 rc.right -= SELL_SPACE_LENGTH;
72                 rc.bottom -= SELL_SPACE_LENGTH;
73
74                 return;
75         }
76
77         VOID CChatChildCtrls::Hide(){
78                 HDWP hdwp = ::BeginDeferWindowPos(GetCtrlCount());
79                 chatDispCtrl.DeferWindowPos(hdwp,chatDispCtrl.m_hWnd,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_HIDEWINDOW);
80                 ::EndDeferWindowPos(hdwp);
81         }
82         
83         VOID CChatChildCtrls::SetCtrl(const RECT  &rc,CCommentList::reference comment,BOOL mulutiLineFlag){
84
85                 
86                 chatDispCtrl.SetWindowText(comment.chatBuf);
87                 RECT chatRect = rc;
88                 
89                 
90                 AdjustRect(chatRect);
91
92                 COLORREF bkColor;
93
94                 if (comment.viewData.selectFlag == TRUE)
95                 {
96                         bkColor = m_master.viewproperty.selectBackColor;
97
98                 }
99                 else  
100                 {
101
102
103                         if(comment.viewData.backColor != CChatData::ViewData::INIT_COLOR){
104                         
105                                 bkColor = comment.viewData.backColor;
106
107                         }else if(comment.listenerData->originBkFlag == TRUE){
108
109                                 bkColor = comment.listenerData->bkColor;
110
111
112                         } else {
113
114                                 bkColor = m_master.viewproperty.backColor;
115
116
117
118                         }
119                 }
120
121
122                 chatDispCtrl.SetBackgroundColor(bkColor);
123 //              dumpln(TEXT("height:%d"),rc.bottom - rc.top);
124                 HDWP hdwp = ::BeginDeferWindowPos(GetCtrlCount());
125                 chatDispCtrl.DeferWindowPos(hdwp,NULL,chatRect.left,chatRect.top,chatRect.right - chatRect.left ,chatRect.bottom - chatRect.top, SWP_NOZORDER | SWP_SHOWWINDOW);
126                 ::EndDeferWindowPos(hdwp);
127                 return;
128         }
129
130         UINT_PTR CChatChildCtrls::GetCtrlCount(){
131
132                 return 1;
133         }
134
135
136
137         ///
138         ///\83R\83\93\83X\83g\83\89\83N\83^
139         ///
140         CChatChildCtrlsList::CChatChildCtrlsList(CCommentView &hMaster):m_hMaster(hMaster){
141                 
142                 return;
143         }
144
145
146
147         ///
148         ///\83R\83\93\83g\83\8d\81[\83\8b\82ð\95\\8e¦
149         ///
150         VOID CChatChildCtrlsList::ShowCntrls(){
151
152
153                 dumpln(TEXT("showcntrls:start"));
154                 RECT headerRect;
155                 RECT tmpRect;
156                 RECT listRect;
157                 m_hMaster.m_commentListWindow.GetClientRect(&listRect);
158                 m_hMaster.m_header.GetItemRect(CCommentView::COMMENT,&headerRect);
159                 headerRect.top = 0;
160                 headerRect.bottom = 0;
161                 
162                 
163                 INT_PTR heightSum =0;
164
165                 auto ctrlsBegin = m_list.begin();
166                 auto ctrlsEnd = m_list.end();
167
168                 if(m_hMaster.commentlist.Size() > 0){
169                 
170                         auto chatDataBegin = m_hMaster.commentlist.GetShortCut();
171
172                         
173                         for(;  chatDataBegin != m_hMaster.commentlist.end() && heightSum < listRect.bottom;++ctrlsBegin,++chatDataBegin){
174                         
175                                 m_hMaster.m_commentListWindow.CalcItemHeight(*chatDataBegin);
176                                 tmpRect = headerRect;
177                                 tmpRect.top += heightSum;
178                                 tmpRect.bottom += heightSum + chatDataBegin->viewData.height;
179
180                                 if(ctrlsBegin == ctrlsEnd)ctrlsBegin = Extend();
181
182                                 ctrlsBegin->SetCtrl(tmpRect,*chatDataBegin,m_hMaster.viewproperty.commentFoldingFlag);
183
184                                 heightSum = tmpRect.bottom;
185                         }
186                 
187                         for(;ctrlsBegin != ctrlsEnd;++ctrlsBegin){
188
189                                 ctrlsBegin->Hide();
190                         }
191                 }
192                 
193
194
195                 return;
196         }
197
198
199
200         VOID CChatChildCtrlsList::AllHide(){
201
202                 auto begin =m_list.begin();
203                 auto end = m_list.end();
204
205
206                 for(;begin != end;++begin){
207                         begin->Hide();
208                 }
209
210         }
211
212         ///
213         ///\8ag\92£\8f\88\97\9d
214         ///
215         CChatChildCtrlsList::iterator CChatChildCtrlsList::Extend(){
216
217                 
218                 CChatChildCtrls ctrls(m_hMaster);
219                 
220                 m_list.push_back(ctrls);
221                 m_list.back().Create();
222                 auto ite = (--m_list.end());
223         
224                 return ite;
225         }
226
227
228         //
229         //\83R\83\81\83\93\83g\83r\83\85\81[\83N\83\89\83X\83\81\83\\83b\83h
230         ///////////////////////////////////////////////////////
231
232         CCommentView::CCommentView(CNicoLiveStream &stream):
233         m_commentListWindow(*this),
234         stream(stream)
235 #ifdef USE_RICHEDIT
236         ,chatChildCtrlsList(*this)
237 #endif
238         {
239
240                 LOGFONT lf = {0};
241                 lf.lfHeight = 10;
242                 lf.lfCharSet = SHIFTJIS_CHARSET;
243
244
245                 hHeaderFontNew = CreateFontIndirect(&lf);
246
247
248                 return;
249
250         }
251
252         CCommentView::~CCommentView(){
253
254
255                 DeleteObject(hHeaderFontNew);
256
257                 return;
258         }
259
260
261
262
263         VOID CCommentView::OnConnect(){
264                 m_commentListWindow.SetRedraw(FALSE);
265                 commentlist.OnConnect();
266
267                 SCROLLINFO vScrollInfo = {0};
268                 vScrollInfo.cbSize = sizeof(vScrollInfo);
269                 vScrollInfo.fMask = SIF_ALL;
270
271                 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
272
273                 m_commentListWindow.SetRedraw(TRUE);
274                 m_commentListWindow.Invalidate();
275
276 #ifdef USE_RICHEDIT
277                 chatChildCtrlsList.AllHide();
278
279 #endif
280
281         }
282
283
284         UINT_PTR CCommentView::GetColumnHolSizeSum(){
285
286                 INT_PTR nMin = 0;
287                 INT_PTR nMax = 0;
288                 this->GetScrollRange(SB_HORZ,&nMin,&nMax);
289
290                 return nMax;
291         }
292
293         VOID CCommentView::SetProperty(CommentViewProperty &setProperty){
294
295                 viewproperty = setProperty;
296                 return;
297         }
298
299         CommentViewProperty &CCommentView::GetProperty(){
300
301                 return viewproperty;
302
303         }
304
305
306
307
308
309         HWND CCommentView::Create(HWND hWndParent){
310
311
312
313                 HWND rslt = __super::Create(hWndParent,0,commentViewConstant::NLITE_COMMENTVIEW,WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_BORDER,0,commentViewConstant::MENU_OR_ID);
314
315                 PAINTSTRUCT ps;
316                 HDC hdc = m_header.BeginPaint(&ps);
317                 SIZE size;
318
319                 HFONT hOld = (HFONT)SelectObject(hdc,hHeaderFontNew);
320
321                 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ñ")};
322                 UINT_PTR holizenSize[] = {0,0,100,0,0};
323
324                 for(UINT_PTR index = 0;index < ARRAY_LENGTH(columns) ;++index){
325
326                         GetTextExtentPoint32(hdc , columns[index] , _tcslen(columns[index]) , &size);
327                         UINT_PTR holsize = holizenSize[index] + size.cx + 15;
328                         holizenSize[index] = viewproperty.headerholSize[index] >= 0 ? viewproperty.headerholSize[index] : holsize;
329                 }
330
331                 SelectObject(hdc,hOld);
332
333                 m_header.EndPaint(&ps);
334
335
336                 HEADERSINFO headersinfo = {columns,holizenSize,ARRAY_LENGTH(columns)};
337
338                 AddHeader(&headersinfo);
339
340                 m_header.SetOrderArray(ARRAY_LENGTH(viewproperty.headerOraderArray),viewproperty.headerOraderArray);
341
342                 
343                 
344
345                 return rslt;
346         }
347
348
349
350
351         LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
352
353
354                 if(lParam->hwndFrom == m_header.m_hWnd){
355
356
357                         auto begin = commentlist.begin();
358
359                         auto end = commentlist.end();
360
361                         for(;begin != end;++begin){
362
363                                 begin->viewData.height = 0;
364
365                         }
366
367                         m_commentListWindow.SetRedraw(FALSE);
368                         SCROLLINFO vScrollInfo = {0};
369                         vScrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
370
371                         this->GetScrollInfo(SB_VERT,&vScrollInfo);
372                         vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
373                         vScrollInfo.fMask = SIF_PAGE;
374                         this->SetScrollInfo(SB_VERT,&vScrollInfo);
375
376                         BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage + 1>= vScrollInfo.nMax;
377                         UINT_PTR commentCount = commentlist.Size();
378                         LPNMHEADER  lpNmHdr = (LPNMHEADER )lParam;
379
380                         m_header.SetItem(lpNmHdr->iItem,lpNmHdr->pitem);
381
382
383
384
385
386
387
388                         if(scrollFlag == TRUE){
389
390                                 this->SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
391                         }
392
393                         INT_PTR itemCount = m_header.GetItemCount();
394                         RECT itemSizeRect;
395
396                         INT_PTR nMax = 0;
397                         for(INT_PTR itemIndex = 0;itemIndex < itemCount;itemIndex++){
398                                 m_header.GetItemRect(itemIndex,&itemSizeRect);
399                                 nMax += itemSizeRect.right - itemSizeRect.left;
400
401                         }
402                         INT_PTR nMin = 0;
403                         this->SetScrollRange(SB_HORZ,nMin,nMax,TRUE);
404                         DecisionHorzSize();
405
406
407                         
408
409                         m_commentListWindow.SetRedraw(TRUE);
410                         if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
411                                 m_commentListWindow.Invalidate();
412                                 m_commentListWindow.Unlock();
413                         }
414
415                 }
416
417                 return 0;
418         }
419
420         VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
421
422
423                 commentlist.OnChatReceve(chat,commnetCountSum,this->m_commentListWindow);
424
425                 return;
426         }
427
428
429         VOID CCommentView::OnChatReceveSettle(UINT_PTR chatNo,UINT_PTR commentCountSum){
430
431
432                 SCROLLINFO vScrollInfo = {0};
433
434
435                 vScrollInfo.fMask = SIF_ALL;
436
437                 this->GetScrollInfo(SB_VERT,&vScrollInfo);
438                 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage >= vScrollInfo.nMax;
439
440                 vScrollInfo.cbSize = sizeof(vScrollInfo);
441                 vScrollInfo.nMax = commentCountSum;
442                 vScrollInfo.fMask = SIF_RANGE | SIF_PAGE;
443                 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
444
445
446                 this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
447
448
449
450
451                 if(scrollFlag == TRUE){
452                         this->SendMessageW(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
453                 }
454
455
456                 if(vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) >= vScrollInfo.nMax - static_cast<INT_PTR>(vScrollInfo.nPage)&& TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
457                         m_commentListWindow.Invalidate();
458 #ifdef USE_RICHEDIT
459                         //chatChildCtrlsList.ShowCntrls();
460 #endif
461                         m_commentListWindow.Unlock();
462                 }
463
464                 return;
465         }
466
467         static UCHAR getrgb(){
468
469                 UCHAR rgb = 192 + rand() % 64;
470                 return rgb;
471         }
472
473
474
475
476
477
478
479
480
481
482
483         LRESULT CCommentView::OnSize(UINT wParam,SIZE lParam){
484                 ChangeSize(lParam);
485
486                 return 0;
487         }
488
489
490         VOID CCommentView::ChangeSize(const SIZE& client){
491
492                 SCROLLINFO hScrollInfo = {0};
493                 hScrollInfo.cbSize = sizeof(hScrollInfo);
494                 hScrollInfo.fMask = SIF_PAGE;
495                 hScrollInfo.nPage = client.cx;
496
497                 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
498                 hScrollInfo.fMask = SIF_ALL;
499                 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
500
501
502                 HDWP hDwp = BeginDeferWindowPos(2);
503
504
505                 INT_PTR movePos =  -1 * hScrollInfo.nPos;
506
507                 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,movePos,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
508                 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,movePos,commentViewConstant::HEADER_HAIGHT,::GetSystemMetrics(SM_CXFULLSCREEN),client.cy - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER);         
509
510                 EndDeferWindowPos(hDwp);
511
512
513                 RECT bkRect;
514                 RECT headerRectSize;
515                 m_header.GetWindowRect(&headerRectSize);
516                 bkRect.left = headerRectSize.right - headerRectSize.left - hScrollInfo.nPos;
517                 bkRect.top = 0;
518                 bkRect.right = client.cx ;
519                 bkRect.bottom = client.cy;
520
521
522                 return;
523         }
524
525
526         LRESULT CCommentView::OnEraseBkgnd(HDC wParam){
527
528                 return TRUE;
529         }
530
531
532         VOID CCommentView::OnDestroy(){
533                 m_header.GetOrderArray(ARRAY_LENGTH(viewproperty.headerOraderArray),viewproperty.headerOraderArray);
534                 INT_PTR headerItemcount = m_header.GetItemCount();
535                 RECT headerItemRect;
536                 for(INT_PTR itemindex = 0;itemindex < headerItemcount;itemindex++){
537
538                         m_header.GetItemRect(itemindex,&headerItemRect);
539                         viewproperty.headerholSize[itemindex] = headerItemRect.right - headerItemRect.left;
540                 }
541                 commentlist.OnDestroy();
542                 m_header.DestroyWindow();
543                 m_commentListWindow.DestroyWindow();
544                 return;
545
546         }
547
548         LRESULT CCommentView::OnHeaderEndDrag(LPNMHDR lParam){
549
550                 if(lParam->hwndFrom == m_header.m_hWnd){
551                         if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
552
553                                 m_commentListWindow.Invalidate();
554                                 m_commentListWindow.Unlock();
555                         }
556
557                 }
558
559                 return 0;
560         }
561
562
563         VOID CCommentView::OnHScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
564
565
566                 INT_PTR dy;
567                 SCROLLINFO hScrollInfo = {0};
568                 hScrollInfo.cbSize = sizeof(hScrollInfo);
569                 hScrollInfo.fMask = SIF_ALL;
570                 this->GetScrollInfo(SB_HORZ,&hScrollInfo);
571                 switch(loWParam){
572
573                 case SB_THUMBPOSITION:
574                 case SB_THUMBTRACK:
575                         dy = hiWParam - hScrollInfo.nPos;
576                         break;
577
578                 case SB_LINELEFT:
579                 case SB_PAGELEFT:
580
581                         dy = -1 * hScrollInfo.nPage;
582
583                         break;
584
585                 case SB_LINERIGHT:
586                 case SB_PAGERIGHT:
587
588                         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;
589
590                         break;
591
592                 default:
593                         dy = 0;
594                         break;
595
596                 }
597
598                 dy = max(-1 * hScrollInfo.nPos, min(dy, hScrollInfo.nMax - hScrollInfo.nPos));
599
600
601                 if(dy != 0){
602                         hScrollInfo.nPos += dy;
603                         INT_PTR moveRange = -(hScrollInfo.nPos);
604
605                         HDWP hDwp = BeginDeferWindowPos(2);
606
607                         m_header.DeferWindowPos(hDwp,m_header.m_hWnd,moveRange,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
608                         m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,moveRange,commentViewConstant::HEADER_HAIGHT,0,0,SWP_NOSIZE | SWP_NOZORDER);         
609
610                         EndDeferWindowPos(hDwp);
611
612
613                         this->SetScrollInfo(SB_HORZ,&hScrollInfo);
614                 }
615
616                 return;
617         }
618
619
620         VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
621
622                 INT_PTR dy;
623                 SCROLLINFO vScrollInfo = {0};
624                 vScrollInfo.fMask = SIF_ALL;
625
626
627                 this->GetScrollInfo(SB_VERT,&vScrollInfo);
628
629                 switch(loWParam){
630
631
632                 case SB_THUMBPOSITION:
633                 case SB_THUMBTRACK:
634
635                         dy = hiWParam - vScrollInfo.nPos;
636
637                         break;
638
639                 case SB_LINEUP:
640
641                         dy = -1;
642                         break;
643
644                 case SB_LINEDOWN:
645
646                         dy = 1;
647
648                         break;
649
650                 case SB_PAGEUP:
651
652                         dy = -1 * vScrollInfo.nPage;
653
654                         break;
655
656                 case SB_PAGEDOWN:
657
658                         dy = vScrollInfo.nPage;
659
660                         break;
661
662
663                 case SB_TOP:
664
665                         dy = -vScrollInfo.nPos;
666
667                         break;
668
669                 case SB_BOTTOM:
670
671                         dy = vScrollInfo.nMax;
672
673                         break;
674
675                 default:
676
677                         dy = 0;
678
679                         break;
680
681                 }
682
683
684         
685
686                 if(dy != 0){
687
688                         vScrollInfo.nPos += dy;
689                         //              viewStartHeight = vScrollInfo.nPos;
690                         this->SetScrollPos(SB_VERT,vScrollInfo.nPos);
691                         this->commentlist.SetShortCut(this->GetScrollPos(SB_VERT));
692                         //this->SetScrollInfo(SB_VERT,&vScrollInfo);
693                         this->UpdateWindow();
694                         if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
695                                 m_commentListWindow.Invalidate();
696                                 m_commentListWindow.Unlock();
697                         }
698                 }
699
700
701
702                 return;
703         }
704
705         LRESULT CCommentView::OnCreate(LPCREATESTRUCT lpcs){
706                 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);
707                 m_commentListWindow.Create(m_hWnd,0,commentViewConstant::NLITE_COMMENTLISTWINDOW,WS_CHILD | WS_VISIBLE  | WS_CLIPCHILDREN  , 0,commentViewConstant::LISTWINDOW);
708
709
710
711                 return 0;
712         }
713
714         VOID CCommentView::AddHeader(LPHEADERSINFO infos){
715
716
717                 m_header.SetFont(hHeaderFontNew);
718
719                 HDITEM item;
720                 item.mask = HDI_FORMAT | HDI_TEXT | HDI_WIDTH;
721                 item.fmt = HDF_CENTER | HDF_STRING;
722
723
724                 for(UINT_PTR index = 0;index < infos->count ;++index){
725
726                         item.pszText = infos->columns[index];
727
728                         item.cxy =  infos->holizensize[index];
729                         m_header.AddItem(&item);
730                 }
731
732                 RECT itemRect;
733                 INT_PTR nMax = 0;
734                 UINT_PTR itemCount = m_header.GetItemCount();
735                 for(UINT_PTR u_index = 0;u_index < itemCount;++u_index){
736
737                         m_header.GetItemRect(u_index,&itemRect);
738                         nMax += itemRect.right - itemRect.left;
739
740                 }
741
742                 this->SetScrollRange(SB_HORZ,0,nMax,TRUE);
743
744                 DecisionHorzSize();
745                 return;
746         }
747
748         VOID CCommentView::DecisionHorzSize(){
749
750                 HDWP hWindowPosInfo = BeginDeferWindowPos(2);
751                 RECT bkWindowRect;
752                 this->GetClientRect(&bkWindowRect);
753                 m_header.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
754                 m_commentListWindow.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),bkWindowRect.bottom - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
755
756                 EndDeferWindowPos(hWindowPosInfo);
757
758                 return;
759         }
760
761
762
763
764         //
765         //\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
766         ////////////////////////////////////////////////////////////////////
767
768         CCommentListWindow::CCommentListWindow(CCommentView &in_self):
769         self(in_self)
770         {}
771
772         CCommentListWindow::~CCommentListWindow(){
773         }
774
775
776         VOID CCommentListWindow::OnPaint(HDC in_hdc){
777
778
779
780                 RECT windowRect;
781                 RECT listRect = {0};
782                 RECT clientRect;
783
784                 self.GetClientRect(&clientRect);
785                 clientRect.bottom -= commentViewConstant::HEADER_HAIGHT;
786
787                 this->GetWindowRect(&windowRect);
788                 windowRect.right -= windowRect.left;
789                 windowRect.bottom -= windowRect.top;
790                 windowRect.left = 0;
791                 windowRect.top = 0;
792
793
794                 CPaintDC pdc(*this);
795
796                 {
797                         CMemoryDC mdc(pdc,windowRect);
798                         mdc.SelectFont(AtlGetDefaultGuiFont());
799
800
801                         CCommentList &commentList = self.commentlist;
802
803                         BOOL selectFlag = FALSE;
804                         CCommentList::iterator selectData;
805                         RECT selectRect = {0};
806         
807
808
809                         if(commentList.Size() > 0){
810
811                                 listRect = windowRect;
812                                 listRect.right = self.GetColumnHolSizeSum();            
813
814                                 CCommentList::iterator chatData = commentList.GetShortCut();
815                         
816
817
818
819                                 CBrush baseBkBrush;
820                                 baseBkBrush.CreateSolidBrush(self.viewproperty.backColor);
821                                 mdc.FillRect(&listRect,baseBkBrush);
822                                 baseBkBrush.DeleteObject();
823                                 CCommentList::iterator endData = commentList.end();
824                                 listRect.bottom = 0;
825                                 
826
827                                 for(;chatData != endData && listRect.top < clientRect.bottom;++chatData){
828                                         CalcItemHeight(*chatData);
829
830 //                                      dumpln(TEXT("height:%d"),chatData->viewData.height);
831                                         listRect.bottom += chatData->viewData.height;
832
833                                         if(chatData->viewData.selectFlag == TRUE){
834                                                 selectFlag = TRUE;
835                                                 selectData = chatData;
836                                                 selectRect = listRect;
837                                         } else {
838
839                                                 this->DrawItem(mdc,listRect,*chatData);
840                                         }
841
842
843                                         listRect.top = listRect.bottom;
844                                 }
845
846         
847                                 
848
849                                 if(selectFlag == TRUE){
850                                         this->DrawItem(mdc,selectRect,*selectData);
851                                 }
852
853                         }
854                         windowRect.left = listRect.right;
855                         mdc.FillRect(&windowRect,(HBRUSH)::GetStockObject(GRAY_BRUSH));
856
857
858
859
860                 }
861                 
862
863                 
864
865                 return;
866         }
867
868
869         LRESULT CCommentListWindow::OnSetCtrol(UINT uMsg,WPARAM wparam,LPARAM lparam){
870
871
872 #ifdef USE_RICHEDIT
873                 self.chatChildCtrlsList.ShowCntrls();
874 #endif
875                 dumpln(TEXT("setctrl"));
876
877                 return 0;
878         }
879
880         VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
881
882
883                 SCROLLINFO vScrollInfo = {0};
884                 vScrollInfo.fMask = SIF_ALL;
885
886
887                 self.GetScrollInfo(SB_VERT,&vScrollInfo);
888                 BOOL scrollFlag = (UINT)(vScrollInfo.nPage + vScrollInfo.nPos + 1) >= (UINT)vScrollInfo.nMax;
889                 vScrollInfo.nPage = CalcScrollPage(vScrollInfo.nMax);
890
891                 vScrollInfo.fMask = SIF_PAGE;
892                 self.SetScrollInfo(SB_VERT,&vScrollInfo);
893
894
895
896                 if(scrollFlag == TRUE){
897                         self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
898                 }
899
900                 this->Invalidate();
901
902                 return;
903         }
904
905
906         UINT_PTR CCommentListWindow::CalcScrollPage(UINT_PTR nMax){
907
908                 RECT clientRect;
909                 INT_PTR rslt = 0;
910                 LONG height = 0;
911                 this->GetClientRect(&clientRect);
912
913                 SCROLLINFO vScrollInfo = {0};
914                 if(self.commentlist.empty() != TRUE){
915
916                         CCommentList::reverse_iterator rbegin = self.commentlist.rbegein();
917                         CCommentList::reverse_iterator rend = self.commentlist.rend();
918                         for(;rbegin != rend;++rbegin){
919                                 CalcItemHeight(*rbegin);
920                                 height += rbegin->viewData.height;
921                                 rslt++;
922                                 if(height > clientRect.bottom)goto overclientrect;
923
924                         }
925                 }
926                 /*
927                 vScrollInfo.fMask = SIF_RANGE;
928                 self.GetScrollInfo(SB_VERT,&vScrollInfo);
929                 */
930                 rslt = nMax+ 1;
931
932
933 overclientrect:
934
935                 return rslt;
936         }
937
938         VOID CCommentListWindow::DrawItem(CDC &dc,const RECT &rc,CChatData &chatData){
939
940
941                 RECT noViewRect;                                                                                //\83R\83\81\94Ô\95\\8e¦\97Ì\88æ
942                 RECT userNameViewRect;                                                                  //\83\86\81[\83U\96¼\95\\8e¦\97Ì\88æ
943                 RECT timeViewRect;                                                                              //\8e\9e\8aÔ\95\\8e¦\97Ì\88æ
944                 RECT chatViewRect;                                                                              //\83R\83\81\83\93\83g\95\\8e¦\97Ì\88æ
945                 RECT infoViewRect;                                                                              //\83R\83\81\83\93\83g\8fî\95ñ\95\\8e¦\97Ì\88æ
946
947
948                 //
949                 //\83R\83\81\83\93\83g\8e\9e\8aÔ\95\\8e¦\97p\95\8e\9a\97ñ\8dì\90¬
950                 //
951                 time_t chatTime = (time_t)difftime(chatData.date,self.stream.GetStartTime());
952
953
954                 BOOL beforeStartFlag = chatTime < 0 ? TRUE : FALSE;
955                 TCHAR noString[sizeof(chatData.no) * 8]; 
956                 TCHAR dateString[LENGTH_16];
957                 if(chatData.no != 0)_stprintf(noString,TEXT("%u"),chatData.no);
958                 else _tcscpy(noString,TEXT(""));
959                 CNLiteString timeFormat;
960
961
962                 if(beforeStartFlag == TRUE){
963
964                         timeFormat = TEXT("-");
965                         chatTime = -chatTime;
966                 }
967                 tm ct = *gmtime(&chatTime);
968                 if(ct.tm_hour != 0 ){
969
970                         timeFormat += TEXT("%H:%M:%S");
971
972                 } else {
973
974                         timeFormat += TEXT("%M:%S");
975                 }
976
977                 _tcsftime(dateString,ARRAY_LENGTH(dateString),timeFormat,&ct);
978
979
980                 COLORREF bkColor;                                                                                                       //\94w\8ci\90F
981                 COLORREF sellLineColor;                                                                                         //\98g\90ü\90F
982                 CPen sellLinePen;                                                                                                       //\98g\90ü\95`\89æ\97p\83y\83\93
983                 CPen collLinePen;                                                                                                       //\8d\80\96Ú\8fc\90ü\95`\89æ\97p\83y\83\93
984                 CBrush bkBrush;                                                                                                         //\94w\8ci\95`\89æ\97p\83u\83\89\83V
985                 collLinePen.CreatePen(PS_SOLID,1,self.viewproperty.colLineColor);
986
987
988                 //\91I\91ð\8fó\91Ô\82©\83`\83F\83b\83N
989                 if (chatData.viewData.selectFlag == TRUE)
990                 {
991                         bkColor = self.viewproperty.selectBackColor;
992                         sellLineColor = self.viewproperty.selectSellLineColor;
993                 }
994                 else  
995                 {
996
997                         sellLineColor = chatData.viewData.sellLineColor == CChatData::ViewData::INIT_COLOR ? self.viewproperty.normalSellLineColor : chatData.viewData.sellLineColor;
998
999                         if(chatData.viewData.backColor != CChatData::ViewData::INIT_COLOR){
1000                         
1001                                 bkColor = chatData.viewData.backColor;
1002
1003                         }else if(chatData.listenerData->originBkFlag == TRUE){
1004
1005                                 bkColor = chatData.listenerData->bkColor;
1006
1007
1008                         } else {
1009
1010                                 bkColor = self.viewproperty.backColor;
1011
1012
1013
1014                         }
1015                 }
1016                 
1017                 //\94w\8ci\82Æ\98g\90ü\82ð\95`\89æ
1018                 sellLinePen.CreatePen(PS_SOLID,1,sellLineColor);
1019                 bkBrush.CreateSolidBrush(bkColor);
1020                 dc.SelectPen(sellLinePen);
1021                 dc.SelectBrush(bkBrush);
1022                 dc.Rectangle(rc.left,rc.top  - 1,rc.right ,rc.bottom + 1);
1023                 dc.SetBkColor(bkColor);
1024                 dc.SetTextColor(chatData.viewData.stringColor == CChatData::ViewData::INIT_COLOR ? chatData.viewData.stringColor :self.viewproperty.baseStringColor);
1025
1026                 //\95`\89æ\83T\83C\83Y\82ð\8cv\8eZ
1027
1028                 self.m_header.GetItemRect(CCommentView::NO,&noViewRect);
1029                 self.m_header.GetItemRect(CCommentView::USERNAME,&userNameViewRect);
1030                 self.m_header.GetItemRect(CCommentView::COMMENT,&chatViewRect);
1031                 self.m_header.GetItemRect(CCommentView::TIME,&timeViewRect);
1032                 self.m_header.GetItemRect(CCommentView::INFO,&infoViewRect);
1033
1034                 noViewRect.left += SELL_SPACE_LENGTH;
1035                 userNameViewRect.left += SELL_SPACE_LENGTH;
1036                 timeViewRect.left += SELL_SPACE_LENGTH;
1037                 chatViewRect.left += SELL_SPACE_LENGTH;
1038                 infoViewRect.left += SELL_SPACE_LENGTH;
1039
1040                 noViewRect.right -= SELL_SPACE_LENGTH;
1041                 userNameViewRect.right -= SELL_SPACE_LENGTH;
1042                 timeViewRect.right -= SELL_SPACE_LENGTH;
1043                 chatViewRect.right -= SELL_SPACE_LENGTH;
1044                 infoViewRect.right -= SELL_SPACE_LENGTH;
1045
1046                 noViewRect.top = rc.top + SELL_SPACE_LENGTH;
1047                 userNameViewRect.top = rc.top + SELL_SPACE_LENGTH;
1048                 timeViewRect.top = rc.top + SELL_SPACE_LENGTH;
1049                 chatViewRect.top = rc.top + SELL_SPACE_LENGTH;
1050                 infoViewRect.top = rc.top + SELL_SPACE_LENGTH;
1051
1052                 noViewRect.bottom = rc.bottom - SELL_SPACE_LENGTH;
1053                 userNameViewRect.bottom = rc.bottom - SELL_SPACE_LENGTH;
1054                 timeViewRect.bottom = rc.bottom - SELL_SPACE_LENGTH;
1055                 chatViewRect.bottom = rc.bottom - SELL_SPACE_LENGTH;
1056                 infoViewRect.bottom = rc.bottom - SELL_SPACE_LENGTH;
1057
1058                 //\8d\80\96Ú\82Ì\8fc\90ü\82ð\95`\89æ
1059                 dc.SelectPen(collLinePen);
1060                 dc.MoveTo(noViewRect.right,rc.top);
1061                 dc.LineTo(noViewRect.right,rc.bottom);
1062                 dc.MoveTo(userNameViewRect.right,rc.top);
1063                 dc.LineTo(userNameViewRect.right,rc.bottom);
1064                 dc.MoveTo(chatViewRect.right,rc.top);
1065                 dc.LineTo(chatViewRect.right,rc.bottom);
1066                 dc.MoveTo(timeViewRect.right,rc.top);
1067                 dc.LineTo(timeViewRect.right,rc.bottom);
1068
1069
1070                 //\83e\83L\83X\83g\95`\89æ
1071                 dc.DrawTextW(noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
1072                 dc.DrawTextW(chatData.listenerData->user_id,chatData.listenerData->user_id.Length(),&userNameViewRect,DT_WORD_ELLIPSIS);
1073                 dc.DrawTextW(chatData.chatBuf,chatData.chatBuf.Length(),&chatViewRect,DT_WORDBREAK | DT_EDITCONTROL);
1074                 dc.DrawTextW(dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
1075
1076                 return;
1077         }
1078
1079
1080
1081         VOID CCommentListWindow::ShowCurSel(){
1082
1083                 auto end = self.commentlist.end();
1084                 INT_PTR cursel = self.commentlist.GetCurSelNo();
1085                 if(cursel == -1)goto end;
1086
1087                 SCROLLINFO vScrollInfo;
1088                 vScrollInfo.cbSize = sizeof(vScrollInfo);
1089                 vScrollInfo.fMask = SIF_ALL;
1090                 self.GetScrollInfo(SB_VERT,&vScrollInfo);
1091                 
1092                 if(!(cursel >= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2 && cursel <= vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) / 2)){
1093                         self.SetScrollPos(SB_VERT,cursel - (vScrollInfo.nPage / 2));
1094                 }
1095
1096                 this->Invalidate();
1097 end:
1098
1099                 return;
1100         }
1101
1102
1103
1104         VOID CCommentListWindow::CalcItemHeight(CChatData &chatData){
1105                 
1106                 if(chatData.viewData.height == 0){
1107                 //      dumpln(TEXT("viewdataupdate"));
1108                         RECT drowSize;
1109                         self.m_header.GetItemRect(CCommentView::COMMENT,&drowSize);
1110                 
1111                         drowSize.bottom = 0;
1112
1113                         CChatReadEdit cedit;
1114                 
1115                         cedit.GeneralCreate(*this,ENM_REQUESTRESIZE,CALCEDIT_ID);
1116                         cedit.SetWindowText(TEXT(""));
1117                         cedit.SetWindowPos(NULL,0,0,drowSize.right - drowSize.left,drowSize.bottom - drowSize.top,SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
1118                         cedit.SetWindowText(chatData.chatBuf);
1119                         cedit.GetClientRect(&drowSize);
1120                         cedit.DestroyWindow();
1121                         if(drowSize.bottom - drowSize.top > 70)drowSize.bottom = drowSize.top + 70;
1122                         chatData.viewData.height = drowSize.bottom - drowSize.top;
1123                 }
1124
1125                 return ;
1126         }
1127
1128
1129
1130         LRESULT CCommentListWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){
1131                 
1132                 return 0;
1133         }
1134
1135         CCommentList::iterator CCommentListWindow::CalcClickLine(INT_PTR height){
1136
1137                 INT_PTR heightSum = 0;
1138
1139                 CCommentList::iterator chatData = self.commentlist.GetShortCut();
1140                 CCommentList::iterator end  = self.commentlist.end();
1141                 dumpln(TEXT("height:%d"),height);
1142         
1143                 for(; chatData != end ;(++chatData)){
1144                         CalcItemHeight(*chatData);
1145                         heightSum += chatData->viewData.height;
1146                         dumpln(TEXT("height:%d"),heightSum);
1147                         
1148                         if(heightSum >= height)break;
1149                 }
1150                 
1151
1152
1153
1154                 return chatData;
1155         }
1156
1157
1158
1159         VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
1160
1161
1162
1163
1164
1165                 if(point.x > (INT_PTR)self.GetColumnHolSizeSum()) goto end;
1166
1167                 this->SetFocus();
1168                 if(self.commentlist.empty() == TRUE)goto end;
1169                 
1170                 self.commentlist.SetCurSel(CalcClickLine(point.y));
1171                 if(TryEnterCriticalSection(&this->m_sec) == TRUE){
1172                         this->Invalidate();
1173                         this->Unlock();
1174                 }
1175
1176                 
1177
1178 end:
1179
1180                 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1181
1182                 return;
1183         }
1184
1185
1186         VOID CCommentListWindow::OnLButtonDblClk(UINT wParam, _WTYPES_NS::CPoint &point){
1187
1188
1189
1190                 if(point.x > (INT_PTR)self.GetColumnHolSizeSum()) return;
1191                 auto end  = self.commentlist.end();
1192                 auto lineIte = CalcClickLine(point.y);
1193                 if( lineIte == end)return;
1194                 
1195                 
1196                 COLORREF bkColor;
1197                 if(lineIte->listenerData->originBkFlag == FALSE){
1198                         CListenerColorCollector colorCollector;
1199                         listenerList.BkColorCollect(colorCollector);
1200                         UCHAR red;
1201                         UCHAR green;
1202                         UCHAR blue;
1203
1204                         srand((unsigned int)time(NULL));
1205                         do{
1206
1207                                 red = getrgb();
1208                                 green = getrgb();
1209                                 blue = getrgb();
1210                                 bkColor = PALETTERGB(red,green,blue);
1211
1212                         }while(colorCollector.Find(bkColor));
1213
1214                         lineIte->listenerData->originBkFlag = TRUE;
1215                         lineIte->listenerData->SetBkColor(bkColor);
1216                 } else {
1217
1218
1219                         lineIte->listenerData->originBkFlag = FALSE;
1220                 }
1221
1222
1223
1224
1225
1226
1227                 if(TryEnterCriticalSection(&this->m_sec) == TRUE){
1228                         this->Invalidate(TRUE);
1229                         this->Unlock();
1230                 }
1231
1232
1233
1234                 this->SendMessage(UM_COMMENTVIEW_SETCTRL,NULL,NULL);
1235                 return;
1236         }
1237
1238         LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
1239
1240                 return TRUE;
1241         }
1242
1243         VOID CCommentListWindow::OnKeyDown(TCHAR vKey,UINT loLParam,UINT hiLParam){
1244
1245                 INT_PTR dy = 0;
1246                 switch(vKey){
1247
1248                 case VK_DOWN:
1249                 case VK_RETURN:
1250                         dy = 1;
1251
1252                         break;
1253                 case VK_UP:
1254
1255                         dy = -1;
1256                         break;
1257                 default:
1258                         break;
1259
1260
1261                 }
1262
1263                 
1264                 
1265
1266                 auto cursel = self.commentlist.GetCurSel();
1267                 if(dy < 0 || dy >= static_cast<INT_PTR>(self.commentlist.Size()))goto end;
1268
1269                 
1270                 std::advance(cursel,dy);
1271                 self.commentlist.SetCurSel(cursel);
1272
1273                 this->ShowCurSel();
1274 end:
1275
1276                                         
1277                 return;
1278         }
1279
1280         LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
1281
1282
1283                 self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
1284
1285
1286                 return 0;
1287         }
1288
1289
1290         LRESULT CCommentListWindow::OnChatControlNortify(LPNMHDR lParam){
1291
1292                 LRESULT rslt = 0;
1293
1294                 switch(lParam->code){
1295
1296                 case EN_LINK:
1297
1298
1299                         break;
1300
1301                         /*
1302                 case EN_REQUESTRESIZE:
1303                         {
1304                                 REQRESIZE *pReqResize = (REQRESIZE *) lParam;
1305                                 self.chatChildCtrlsList.rcBuf = pReqResize->rc;
1306                                 dumpln(TEXT("calcheight:%d"),pReqResize->rc.bottom - pReqResize->rc.top);
1307                         }
1308                         break;
1309                         */
1310
1311                 case EN_MSGFILTER:
1312
1313
1314                         break;
1315
1316
1317                 default:
1318
1319                         break;
1320
1321                 }
1322
1323
1324                 return rslt;
1325         }
1326
1327         LRESULT CCommentListWindow::OnCalcSellSize(LPNMHDR lParam){
1328
1329                 auto pReqResize = reinterpret_cast <REQRESIZE *>(lParam);
1330                 ::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);
1331                 //calcRc = pReqResize->rc;
1332                 return 0;
1333         }
1334
1335 }