OSDN Git Service

2012/01/21 16:25:45
[nlite/nlite.git] / nlite / nlite_commentview.cpp
1 #include "stdafx.h"
2 #include "nlite_include.h"
3
4
5 namespace nlite{
6
7 //
8 //\83R\83\81\83\93\83g\83r\83\85\81[\83N\83\89\83X\83\81\83\\83b\83h
9 ///////////////////////////////////////////////////////
10
11 CCommentView::CCommentView():
12                 m_commentListWindow(*this)
13         {
14
15                 LOGFONT lf = {0};
16                 lf.lfHeight = 10;
17                 lf.lfCharSet = SHIFTJIS_CHARSET;
18
19
20                 hHeaderFontNew = CreateFontIndirect(&lf);
21
22                 
23                 return;
24
25 }
26
27 CCommentView::~CCommentView(){
28
29
30         DeleteObject(hHeaderFontNew);
31
32         return;
33 }
34
35
36
37
38 VOID CCommentView::OnConnect(){
39         m_commentListWindow.SetRedraw(FALSE);
40         commentlist.OnConnect();
41         
42         SCROLLINFO vScrollInfo = {0};
43         vScrollInfo.cbSize = sizeof(vScrollInfo);
44         vScrollInfo.fMask = SIF_RANGE;
45
46         
47         this->SetScrollPos(SB_VERT,0,FALSE);
48
49         m_commentListWindow.SetRedraw(TRUE);
50         
51         
52 }
53
54
55 UINT_PTR CCommentView::GetColumnHolSizeSum(){
56
57         INT_PTR nMin = 0;
58         INT_PTR nMax = 0;
59         this->GetScrollRange(SB_HORZ,&nMin,&nMax);
60
61         return nMax;
62 }
63
64 VOID CCommentView::SetProperty(CommentViewProperty &setProperty){
65
66         viewproperty = setProperty;
67         return;
68 }
69
70 CommentViewProperty &CCommentView::GetProperty(){
71
72         return viewproperty;
73
74 }
75
76
77
78
79
80 HWND CCommentView::Create(HWND hWndParent){
81
82         
83
84         HWND rslt = __super::Create(hWndParent,0,commentViewConstant::NLITE_COMMENTVIEW,WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_BORDER,0,commentViewConstant::MENU_OR_ID);
85
86         PAINTSTRUCT ps;
87         HDC hdc = m_header.BeginPaint(&ps);
88         SIZE size;
89
90         HFONT hOld = (HFONT)SelectObject(hdc,hHeaderFontNew);
91
92         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ñ")};
93         UINT_PTR holizenSize[] = {0,0,100,0,0};
94
95         for(UINT_PTR index = 0;index < ARRAY_LENGTH(columns) ;++index){
96
97                 GetTextExtentPoint32(hdc , columns[index] , _tcslen(columns[index]) , &size);
98                 UINT_PTR holsize = holizenSize[index] + size.cx + 15;
99                 holizenSize[index] = viewproperty.headerholSize[index] >= 0 ? viewproperty.headerholSize[index] : holsize;
100         }
101
102         SelectObject(hdc,hOld);
103
104         m_header.EndPaint(&ps);
105                         
106                         
107         HEADERSINFO headersinfo = {columns,holizenSize,ARRAY_LENGTH(columns)};
108
109         AddHeader(&headersinfo);
110
111         m_header.SetOrderArray(ARRAY_LENGTH(viewproperty.headerOraderArray),viewproperty.headerOraderArray);
112                 
113                         
114         
115                         
116         return rslt;
117 }
118
119
120
121
122 LRESULT CCommentView::OnHeaderEndTrack(LPNMHDR lParam){
123
124         
125         if(lParam->hwndFrom == m_header.m_hWnd){
126                 
127                 
128                 m_commentListWindow.SetRedraw(FALSE);
129                 SCROLLINFO vScrollInfo = {0};
130                 vScrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
131
132                 this->GetScrollInfo(SB_VERT,&vScrollInfo);
133                 vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
134                 vScrollInfo.fMask = SIF_PAGE;
135                 this->SetScrollInfo(SB_VERT,&vScrollInfo);
136
137                 BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage + 1>= vScrollInfo.nMax;
138                 UINT_PTR commentCount = commentlist.Size();
139                 LPNMHEADER  lpNmHdr = (LPNMHEADER )lParam;
140                 
141                 m_header.SetItem(lpNmHdr->iItem,lpNmHdr->pitem);
142
143
144                 
145                 
146                 
147                 
148
149                 if(scrollFlag == TRUE){
150
151                         this->SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
152                 }
153
154                 INT_PTR itemCount = m_header.GetItemCount();
155                 RECT itemSizeRect;
156                 
157                 INT_PTR nMax = 0;
158                 for(INT_PTR itemIndex = 0;itemIndex < itemCount;itemIndex++){
159                         m_header.GetItemRect(itemIndex,&itemSizeRect);
160                         nMax += itemSizeRect.right - itemSizeRect.left;
161
162                 }
163                 INT_PTR nMin = 0;
164                 this->SetScrollRange(SB_HORZ,nMin,nMax,TRUE);
165                 DecisionHorzSize();
166
167
168                 auto begin = commentlist.begin();
169
170                 auto end = commentlist.end();
171
172                 /*
173                 for(;begin != end;++begin){
174
175                         begin->height = m_commentListWindow.CalcItemHeight(*begin);
176                 }
177                 */
178                 m_commentListWindow.SetRedraw(TRUE);
179                 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
180                         m_commentListWindow.Invalidate();
181                         m_commentListWindow.Unlock();
182                 }
183                         
184         }
185
186         return 0;
187 }
188
189 VOID CCommentView::OnChatReceve(NicoLiveChat_P chat,UINT_PTR commnetCountSum){
190
191         commentlist.OnChatReceve(chat,commnetCountSum,this->m_commentListWindow);
192
193         return;
194 }
195
196
197 VOID CCommentView::SetStreamStatus(StreamStatus &st){
198         
199         streamStatus.SetStreamStatus(st);
200 }
201
202 VOID CCommentView::OnChatReceveSettle(UINT_PTR chatNo,UINT_PTR commentCountSum){
203
204         
205         SCROLLINFO vScrollInfo = {0};
206         
207         //vScrollCcs.Lock();
208
209         vScrollInfo.fMask = SIF_ALL;
210
211         this->GetScrollInfo(SB_VERT,&vScrollInfo);
212         BOOL scrollFlag = vScrollInfo.nPos + (int)vScrollInfo.nPage >= vScrollInfo.nMax;
213         
214
215         
216 //      vScrollInfo.fMask = SIF_RANGE;
217         vScrollInfo.cbSize = sizeof(vScrollInfo);
218
219         vScrollInfo.nMax = commentCountSum;
220 //      this->SetScrollRange(SB_VERT,vScrollInfo.nMin,vScrollInfo.nMax,FALSE);
221 //      this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
222         vScrollInfo.fMask = SIF_RANGE | SIF_PAGE;
223         vScrollInfo.nPage = m_commentListWindow.CalcScrollPage(vScrollInfo.nMax);
224         
225         
226         this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
227
228         
229
230         
231         if(scrollFlag == TRUE){
232                 this->SendMessageW(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
233         }
234         
235
236         if(vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) >= vScrollInfo.nMax - static_cast<INT_PTR>(vScrollInfo.nPage)&& TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
237                 m_commentListWindow.Invalidate();
238                 m_commentListWindow.Unlock();
239         }
240         
241         
242         //this->SetScrollInfo(SB_VERT,NULL);
243
244         return;
245 }
246
247 static UCHAR getrgb(){
248
249         UCHAR rgb = 160 + rand() % 92;
250         return rgb;
251 }
252
253
254
255
256
257
258
259
260
261
262
263 LRESULT CCommentView::OnSize(UINT wParam,SIZE lParam){
264         ChangeSize(lParam);
265                         
266         return 0;
267 }
268
269
270 VOID CCommentView::ChangeSize(const SIZE& client){
271         
272         SCROLLINFO hScrollInfo = {0};
273         hScrollInfo.cbSize = sizeof(hScrollInfo);
274         hScrollInfo.fMask = SIF_PAGE;
275         hScrollInfo.nPage = client.cx;
276         
277         this->SetScrollInfo(SB_HORZ,&hScrollInfo);
278         hScrollInfo.fMask = SIF_ALL;
279         this->GetScrollInfo(SB_HORZ,&hScrollInfo);
280
281         
282         HDWP hDwp = BeginDeferWindowPos(2);
283         
284
285         INT_PTR movePos =  -1 * hScrollInfo.nPos;
286         
287         m_header.DeferWindowPos(hDwp,m_header.m_hWnd,movePos,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
288         m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,movePos,commentViewConstant::HEADER_HAIGHT,::GetSystemMetrics(SM_CXFULLSCREEN),client.cy - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER);         
289
290         EndDeferWindowPos(hDwp);
291         
292         
293         RECT bkRect;
294         RECT headerRectSize;
295         m_header.GetWindowRect(&headerRectSize);
296         bkRect.left = headerRectSize.right - headerRectSize.left - hScrollInfo.nPos;
297         bkRect.top = 0;
298         bkRect.right = client.cx ;
299         bkRect.bottom = client.cy;
300         
301
302         return;
303 }
304
305
306 LRESULT CCommentView::OnEraseBkgnd(HDC wParam){
307
308         return TRUE;
309 }
310
311
312 VOID CCommentView::OnDestroy(){
313         m_header.GetOrderArray(ARRAY_LENGTH(viewproperty.headerOraderArray),viewproperty.headerOraderArray);
314         INT_PTR headerItemcount = m_header.GetItemCount();
315         RECT headerItemRect;
316         for(INT_PTR itemindex = 0;itemindex < headerItemcount;itemindex++){
317                                 
318                 m_header.GetItemRect(itemindex,&headerItemRect);
319                 viewproperty.headerholSize[itemindex] = headerItemRect.right - headerItemRect.left;
320         }
321         commentlist.OnDestroy();
322         m_header.DestroyWindow();
323         m_commentListWindow.DestroyWindow();
324         return;
325
326 }
327
328 LRESULT CCommentView::OnHeaderEndDrag(LPNMHDR lParam){
329
330         if(lParam->hwndFrom == m_header.m_hWnd){
331                 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
332                 
333                         m_commentListWindow.Invalidate();
334                         m_commentListWindow.Unlock();
335                 }
336
337         }
338
339         return 0;
340 }
341
342
343 VOID CCommentView::OnHScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
344
345                         
346         INT_PTR dy;
347         SCROLLINFO hScrollInfo = {0};
348         hScrollInfo.cbSize = sizeof(hScrollInfo);
349         hScrollInfo.fMask = SIF_ALL;
350         this->GetScrollInfo(SB_HORZ,&hScrollInfo);
351         switch(loWParam){
352
353         case SB_THUMBPOSITION:
354         case SB_THUMBTRACK:
355                 dy = hiWParam - hScrollInfo.nPos;
356                 break;
357
358         case SB_LINELEFT:
359         case SB_PAGELEFT:
360
361                 dy = -1 * hScrollInfo.nPage;
362
363                 break;
364
365         case SB_LINERIGHT:
366         case SB_PAGERIGHT:
367
368                 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;
369
370                 break;
371
372         default:
373                 dy = 0;
374                 break;
375
376         }
377         
378         dy = max(-1 * hScrollInfo.nPos, min(dy, hScrollInfo.nMax - hScrollInfo.nPos));
379
380
381         if(dy != 0){
382                 hScrollInfo.nPos += dy;
383                 INT_PTR moveRange = -(hScrollInfo.nPos);
384
385                 HDWP hDwp = BeginDeferWindowPos(2);
386
387                 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,moveRange,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
388                 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,moveRange,commentViewConstant::HEADER_HAIGHT,0,0,SWP_NOSIZE | SWP_NOZORDER);         
389
390                 EndDeferWindowPos(hDwp);
391                                         
392                                         
393                 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
394         }
395                         
396         return;
397 }
398
399
400 VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
401
402         INT_PTR dy;
403         SCROLLINFO vScrollInfo = {0};
404         vScrollInfo.fMask = SIF_ALL;
405
406         
407         this->GetScrollInfo(SB_VERT,&vScrollInfo);
408
409         switch(loWParam){
410
411
412         case SB_THUMBPOSITION:
413         case SB_THUMBTRACK:
414
415                 dy = hiWParam - vScrollInfo.nPos;
416
417                 break;
418
419         case SB_LINEUP:
420
421                 dy = -1;
422                 break;
423
424         case SB_LINEDOWN:
425
426                 dy = 1;
427
428                 break;
429
430         case SB_PAGEUP:
431
432                 dy = -1 * vScrollInfo.nPage;
433
434                 break;
435
436         case SB_PAGEDOWN:
437
438                 dy = vScrollInfo.nPage;
439
440                 break;
441
442
443         case SB_TOP:
444
445                 dy = -vScrollInfo.nPos;
446
447                 break;
448
449         case SB_BOTTOM:
450
451                 dy = vScrollInfo.nMax;
452
453                 break;
454
455         default:
456
457                 dy = 0;
458
459                 break;
460
461         }
462
463         
464
465
466         if(dy != 0){
467
468                 vScrollInfo.nPos += dy;
469 //              viewStartHeight = vScrollInfo.nPos;
470                 this->SetScrollPos(SB_VERT,vScrollInfo.nPos);
471                 //this->SetScrollInfo(SB_VERT,&vScrollInfo);
472                 this->UpdateWindow();
473                 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
474                         m_commentListWindow.Invalidate();
475                         m_commentListWindow.Unlock();
476                 }
477         }
478
479         
480                 
481         return;
482 }
483
484 LRESULT CCommentView::OnCreate(LPCREATESTRUCT lpcs){
485         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);
486         m_commentListWindow.Create(m_hWnd,0,commentViewConstant::NLITE_COMMENTLISTWINDOW,WS_CHILD | WS_VISIBLE  | WS_CLIPCHILDREN  , 0,commentViewConstant::LISTBOX_ID);
487         
488         
489         
490         
491         return 0;
492 }
493
494 VOID CCommentView::AddHeader(LPHEADERSINFO infos){
495
496
497         m_header.SetFont(hHeaderFontNew);
498
499         HDITEM item;
500         item.mask = HDI_FORMAT | HDI_TEXT | HDI_WIDTH;
501         item.fmt = HDF_CENTER | HDF_STRING;
502                         
503                         
504         for(UINT_PTR index = 0;index < infos->count ;++index){
505
506                 item.pszText = infos->columns[index];
507
508                 item.cxy =  infos->holizensize[index];
509                 m_header.AddItem(&item);
510         }
511
512         RECT itemRect;
513         INT_PTR nMax = 0;
514         UINT_PTR itemCount = m_header.GetItemCount();
515         for(UINT_PTR u_index = 0;u_index < itemCount;++u_index){
516
517                 m_header.GetItemRect(u_index,&itemRect);
518                 nMax += itemRect.right - itemRect.left;
519
520         }
521         
522         this->SetScrollRange(SB_HORZ,0,nMax,TRUE);
523         
524         DecisionHorzSize();
525         return;
526 }
527
528 VOID CCommentView::DecisionHorzSize(){
529         
530         HDWP hWindowPosInfo = BeginDeferWindowPos(2);
531         RECT bkWindowRect;
532         this->GetClientRect(&bkWindowRect);
533         m_header.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
534         m_commentListWindow.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),bkWindowRect.bottom - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
535
536         EndDeferWindowPos(hWindowPosInfo);
537                         
538         return;
539 }
540
541
542
543
544 //
545 //\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
546 ////////////////////////////////////////////////////////////////////
547
548 CCommentListWindow::CCommentListWindow(CCommentView &in_self):
549         self(in_self)
550         {}
551
552 CCommentListWindow::~CCommentListWindow(){
553 }
554
555
556 VOID CCommentListWindow::OnPaint(HDC in_hdc){
557
558         
559         
560         RECT windowRect;
561
562         RECT clientRect;
563         
564         self.GetClientRect(&clientRect);
565         clientRect.bottom -= commentViewConstant::HEADER_HAIGHT;
566
567         this->GetWindowRect(&windowRect);
568         windowRect.right -= windowRect.left;
569         windowRect.bottom -= windowRect.top;
570         windowRect.left = 0;
571         windowRect.top = 0;
572         RECT listRect = windowRect;
573         listRect.right = self.GetColumnHolSizeSum();
574         CPaintDC pdc(*this);
575         
576         {
577                 CMemoryDC mdc(pdc,windowRect);
578                 mdc.SelectFont(AtlGetDefaultGuiFont());
579                 mdc.FillRect(&clientRect,(HBRUSH)::GetStockObject(GRAY_BRUSH));
580
581                 CCommentList &commentList = self.commentlist;
582
583                 BOOL selectFlag = FALSE;
584                 CCommentList::iterator selectData;
585                 RECT selectRect = {0};
586                 UINT_PTR viewStartHeight = self.GetScrollPos(SB_VERT);
587                 
588         
589                 if(commentList.Size() > (UINT_PTR)viewStartHeight){
590
591         
592                         
593                         CCommentList::iterator chatData = commentList.begin();
594                         std::advance(chatData,viewStartHeight);
595                 
596
597
598                         CBrush baseBkBrush;
599                         baseBkBrush.CreateSolidBrush(self.viewproperty.backColor);
600                         mdc.FillRect(&listRect,baseBkBrush);
601                         baseBkBrush.DeleteObject();
602                         CCommentList::iterator endData = commentList.end();
603                         listRect.bottom = 0;
604
605                         CPen outLinePen;
606                         outLinePen.CreatePen(PS_SOLID,1,ColorList::outLineNomal);
607                         mdc.SelectPen(outLinePen);
608                         mdc.MoveTo(listRect.right,listRect.top);
609                         mdc.LineTo(listRect.right,listRect.bottom);
610
611
612                         for(;chatData != endData && listRect.top < clientRect.bottom;++chatData){
613                                 listRect.bottom +=      CalcItemHeight(*chatData);
614
615                                 
616                                 if(chatData->selectFlag == TRUE){
617                                         selectFlag = TRUE;
618                                         selectData = chatData;
619                                         selectRect = listRect;
620                                 } else {
621                                 
622                                         this->DrawItem(mdc,listRect,*chatData);
623                                 }
624                         
625                         
626                                 listRect.top = listRect.bottom;
627                         }
628
629                         mdc.SelectPen(outLinePen);
630                         mdc.MoveTo(listRect.left,listRect.bottom);
631                         mdc.LineTo(listRect.right,listRect.bottom);
632                         
633                         if(selectFlag == TRUE){
634                                 this->DrawItem(mdc,selectRect,*selectData);
635                         }
636
637                 }
638
639         
640         
641         
642         }
643
644         
645
646         
647         return;
648 }
649
650 VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
651
652         
653         SCROLLINFO vScrollInfo = {0};
654         vScrollInfo.fMask = SIF_ALL;
655
656
657         self.GetScrollInfo(SB_VERT,&vScrollInfo);
658         BOOL scrollFlag = (UINT)(vScrollInfo.nPage + vScrollInfo.nPos + 1) >= (UINT)vScrollInfo.nMax;
659         vScrollInfo.nPage = CalcScrollPage(vScrollInfo.nMax);
660         
661         vScrollInfo.fMask = SIF_PAGE;
662         self.SetScrollInfo(SB_VERT,&vScrollInfo);
663
664         
665         
666         if(scrollFlag == TRUE){
667                 self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
668         }
669
670         this->Invalidate();
671         
672         return;
673 }
674
675
676 UINT_PTR CCommentListWindow::CalcScrollPage(UINT_PTR nMax){
677         
678         RECT clientRect;
679         INT_PTR rslt = 0;
680         LONG height = 0;
681         this->GetClientRect(&clientRect);
682         
683         SCROLLINFO vScrollInfo = {0};
684         if(self.commentlist.empty() != TRUE){
685                 
686                 CCommentList::reverse_iterator rbegin = self.commentlist.rbegein();
687                 CCommentList::reverse_iterator rend = self.commentlist.rend();
688                 for(;rbegin != rend;++rbegin){
689
690                         height += CalcItemHeight(*rbegin);
691                         rslt++;
692                         if(height > clientRect.bottom)goto overclientrect;
693                         
694                 }
695         }
696         /*
697         vScrollInfo.fMask = SIF_RANGE;
698         self.GetScrollInfo(SB_VERT,&vScrollInfo);
699         */
700         rslt = nMax+ 1;
701
702         
703 overclientrect:
704
705         return rslt;
706 }
707
708 VOID CCommentListWindow::DrawItem(CDC &dc,RECT &rc,CChatData &chatData){
709
710         
711         RECT noViewRect;
712         RECT userNameViewRect;
713         RECT timeViewRect;
714         RECT chatViewRect;
715         RECT infoViewRect;
716         
717
718         time_t chatTime = (time_t)difftime(chatData.date,self.streamStatus.start_time);
719         
720         
721         BOOL beforeStartFlag = chatTime < 0 ? TRUE : FALSE;
722         TCHAR noString[sizeof(chatData.no) * 8]; 
723         TCHAR dateString[LENGTH_16];
724         _stprintf(noString,TEXT("%u"),chatData.no);
725
726         CNLiteString timeFormat;
727
728
729         if(beforeStartFlag == TRUE){
730
731                 timeFormat = TEXT("-");
732                 chatTime = -chatTime;
733         }
734         tm ct = *gmtime(&chatTime);
735         if(ct.tm_hour != 0 ){
736
737                 timeFormat += TEXT("%H:%M:%S");
738                 
739         } else {
740
741                 timeFormat += TEXT("%M:%S");
742         }
743
744         _tcsftime(dateString,ARRAY_LENGTH(dateString),timeFormat,&ct);
745
746         COLORREF bkColor;
747         COLORREF outLineColor;
748         
749         CPen outLinePen;
750         CPen colLinePen;
751         CBrush bkBrush;
752         colLinePen.CreatePen(PS_SOLID,1,ColorList::colLine);
753         
754         
755         //\91I\91ð\8fó\91Ô\82©\83`\83F\83b\83N
756         if (chatData.selectFlag == TRUE)
757         {
758                 bkColor = ColorList::selectBack;
759                 outLineColor = ColorList::outLineSelect;
760                 
761                 
762         }
763         else  
764         {
765                 
766                 outLineColor = ColorList::outLineNomal;
767
768                 if(chatData.listenerData->originBkFlag == TRUE){
769                         
770                         bkColor = chatData.listenerData->bkColor;
771                         
772                         
773                 } else {
774                         
775                         bkColor = self.viewproperty.backColor;
776                         
777                         
778                         
779                 }
780         }
781
782         outLinePen.CreatePen(PS_SOLID,1,outLineColor);
783         bkBrush.CreateSolidBrush(bkColor);
784         dc.SelectPen(outLinePen);
785         
786         if(chatData.selectFlag == TRUE){
787                 
788                 dc.MoveTo(rc.left,rc.bottom);
789                 dc.LineTo(rc.right,rc.bottom);
790         }
791         dc.FillRect(&rc,bkBrush);
792         dc.SetBkColor(bkColor);
793         dc.MoveTo(rc.left,rc.top);
794         dc.LineTo(rc.right,rc.top);
795         
796         
797         
798         dc.SetTextColor(self.viewproperty.baseStringColor);
799         
800         
801         
802         
803
804         //\95`\89æ\83T\83C\83Y\82ð\8cv\8eZ
805         
806         self.m_header.GetItemRect(CCommentView::NO,&noViewRect);
807         self.m_header.GetItemRect(CCommentView::USERNAME,&userNameViewRect);
808         self.m_header.GetItemRect(CCommentView::COMMENT,&chatViewRect);
809         self.m_header.GetItemRect(CCommentView::TIME,&timeViewRect);
810         self.m_header.GetItemRect(CCommentView::INFO,&infoViewRect);
811
812         noViewRect.left += 2;
813         userNameViewRect.left += 2;
814         timeViewRect.left += 2;
815         chatViewRect.left += 2;
816         infoViewRect.left += 2;
817
818         noViewRect.right -= 2;
819         userNameViewRect.right -= 2;
820         timeViewRect.right -= 2;
821         chatViewRect.right -= 2;
822         infoViewRect.right -= 2;
823         
824         noViewRect.top = rc.top + 2;
825         userNameViewRect.top = rc.top + 2;
826         timeViewRect.top = rc.top + 2;
827         chatViewRect.top = rc.top + 2;
828         infoViewRect.top = rc.top + 2;
829
830         noViewRect.bottom = rc.bottom - 2;
831         userNameViewRect.bottom = rc.bottom - 2;
832         timeViewRect.bottom = rc.bottom - 2;
833         chatViewRect.bottom = rc.bottom - 2;
834         infoViewRect.bottom = rc.bottom - 2;
835         
836         dc.SelectPen(colLinePen);
837
838         dc.MoveTo(noViewRect.right,rc.top);
839         dc.LineTo(noViewRect.right,rc.bottom);
840         dc.MoveTo(userNameViewRect.right,rc.top);
841         dc.LineTo(userNameViewRect.right,rc.bottom);
842         dc.MoveTo(chatViewRect.right,rc.top);
843         dc.LineTo(chatViewRect.right,rc.bottom);
844         dc.MoveTo(timeViewRect.right,rc.top);
845         dc.LineTo(timeViewRect.right,rc.bottom);
846
847         dc.DrawTextW(noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
848         dc.DrawTextW(chatData.listenerData->user_id,chatData.listenerData->user_id.GetLength(),&userNameViewRect,DT_WORD_ELLIPSIS);
849         dc.DrawTextW(chatData.chatBuf,chatData.chatBuf.GetLength(),&chatViewRect,DT_WORDBREAK);
850         dc.DrawTextW(dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
851         
852         return;
853 }
854
855
856 UINT_PTR CCommentListWindow::CalcItemHeight(CChatData &chatData){
857
858         RECT drowSize;
859         self.m_header.GetItemRect(CCommentView::COMMENT,&drowSize);
860         drowSize.left += 2;
861         drowSize.top +=  2;
862         drowSize.right -= 2;
863         drowSize.bottom = 0;
864
865         CPaintDC pdc(*this);
866         pdc.SelectFont(AtlGetDefaultGuiFont());
867         ::DrawTextW(pdc,chatData.chatBuf,chatData.chatBuf.GetLength(),&drowSize, DT_CALCRECT | DT_WORDBREAK);
868         drowSize.top -= 2;
869         drowSize.bottom += 2;
870
871         return drowSize.bottom;
872 }
873
874
875 LRESULT CCommentListWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){
876         
877         return 0;
878 }
879
880 INT_PTR CCommentListWindow::CalcClickLine(INT_PTR height){
881         SCROLLINFO vScrollInfo = {0};
882         vScrollInfo.fMask = SIF_POS;
883
884         self.GetScrollInfo(SB_VERT,&vScrollInfo);
885
886         INT_PTR heightSum = 0;
887         INT_PTR lineNo = vScrollInfo.nPos;
888         CCommentList::iterator chatData = self.commentlist.begin();
889         CCommentList::iterator end = self.commentlist.end();    
890         std::advance(chatData,vScrollInfo.nPos);
891         for(; chatData != end;++chatData){
892                 
893                 heightSum += CalcItemHeight(*chatData);
894
895                 if(heightSum >= height){
896
897                         goto end;
898                 }
899
900                 ++lineNo;
901         }
902         lineNo = -1;
903 end:
904
905
906         return lineNo;
907 }
908
909
910
911 VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
912
913
914         
915         this->SetFocus();
916         if(self.commentlist.empty() == TRUE)return;
917         auto curselItem = self.commentlist.GetCurSelItem();
918         if(curselItem != self.commentlist.end()){
919                 curselItem->selectFlag = FALSE;
920         }
921         self.commentlist.SetCurSel(CalcClickLine(point.y));
922         if(TryEnterCriticalSection(&this->m_sec) == TRUE){
923                 this->Invalidate();
924                 this->Unlock();
925         }
926         return;
927 }
928
929
930 VOID CCommentListWindow::OnLButtonDbClk(UINT wParam, _WTYPES_NS::CPoint &point){
931
932         
933
934         
935         this->SetFocus();
936         if(self.commentlist.empty() == TRUE)return;
937                 
938         auto chatData = self.commentlist.GetChatAt(CalcClickLine(point.y));
939         COLORREF bkColor;
940         if(chatData.listenerData->originBkFlag == FALSE){
941                 CListenerColorCollector colorCollector;
942                 listenerList.BkColorCollect(colorCollector);
943                 UCHAR red;
944                 UCHAR green;
945                 UCHAR blue;
946                 
947                 srand((unsigned int)time(NULL));
948                 do{
949
950                         red = getrgb();
951                         green = getrgb();
952                         blue = getrgb();
953                         bkColor = RGB(red,green,blue);
954
955                 }while(colorCollector.Find(bkColor));
956                 
957                 chatData.listenerData->originBkFlag = TRUE;
958                 chatData.listenerData->SetBkColor(bkColor);
959         } else {
960
961                 
962                 chatData.listenerData->originBkFlag = FALSE;
963         }
964
965         
966         
967
968         
969
970         if(TryEnterCriticalSection(&this->m_sec) == TRUE){
971                 this->Invalidate(TRUE);
972                 this->Unlock();
973         }
974         
975         
976         
977         
978         return;
979 }
980
981 LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
982
983         return TRUE;
984 }
985
986 LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
987
988         
989         self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
990
991
992         return 0;
993 }
994
995
996
997 }