OSDN Git Service

2012/01/20 17:02:52
[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();
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,FALSE);
218
219         vScrollInfo.nMax = commentCountSum;
220         this->SetScrollInfo(SB_VERT,&vScrollInfo,FALSE);
221         vScrollInfo.fMask = SIF_PAGE;
222         vScrollInfo.nPage = m_commentListWindow.CalcScrollPage();
223         
224         
225         this->SetScrollInfo(SB_VERT,&vScrollInfo);
226
227         
228
229         
230         if(scrollFlag == TRUE){
231                 this->SendMessageW(WM_VSCROLL,MAKEWORD(SB_BOTTOM,0),0);
232         }
233         
234
235         if(vScrollInfo.nPos + static_cast<INT_PTR>(vScrollInfo.nPage) >= vScrollInfo.nMax - static_cast<INT_PTR>(vScrollInfo.nPage)&& TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
236                 m_commentListWindow.Invalidate();
237                 m_commentListWindow.Unlock();
238         }
239         
240         this->SetScrollInfo(SB_VERT,NULL);
241
242         return;
243 }
244
245 static UCHAR getrgb(){
246
247         UCHAR rgb = 160 + rand() % 92;
248         return rgb;
249 }
250
251
252
253
254
255
256
257
258
259
260
261 LRESULT CCommentView::OnSize(UINT wParam,SIZE lParam){
262         ChangeSize(lParam);
263                         
264         return 0;
265 }
266
267
268 VOID CCommentView::ChangeSize(const SIZE& client){
269         
270         SCROLLINFO hScrollInfo = {0};
271         hScrollInfo.cbSize = sizeof(hScrollInfo);
272         hScrollInfo.fMask = SIF_PAGE;
273         hScrollInfo.nPage = client.cx;
274         
275         this->SetScrollInfo(SB_HORZ,&hScrollInfo);
276         hScrollInfo.fMask = SIF_ALL;
277         this->GetScrollInfo(SB_HORZ,&hScrollInfo);
278
279         
280         HDWP hDwp = BeginDeferWindowPos(2);
281         
282
283         INT_PTR movePos =  -1 * hScrollInfo.nPos;
284         
285         m_header.DeferWindowPos(hDwp,m_header.m_hWnd,movePos,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
286         m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,movePos,commentViewConstant::HEADER_HAIGHT,::GetSystemMetrics(SM_CXFULLSCREEN),client.cy - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER);         
287
288         EndDeferWindowPos(hDwp);
289         
290         
291         RECT bkRect;
292         RECT headerRectSize;
293         m_header.GetWindowRect(&headerRectSize);
294         bkRect.left = headerRectSize.right - headerRectSize.left - hScrollInfo.nPos;
295         bkRect.top = 0;
296         bkRect.right = client.cx ;
297         bkRect.bottom = client.cy;
298         
299
300         return;
301 }
302
303
304 LRESULT CCommentView::OnEraseBkgnd(HDC wParam){
305
306         return TRUE;
307 }
308
309
310 VOID CCommentView::OnDestroy(){
311         m_header.GetOrderArray(ARRAY_LENGTH(viewproperty.headerOraderArray),viewproperty.headerOraderArray);
312         INT_PTR headerItemcount = m_header.GetItemCount();
313         RECT headerItemRect;
314         for(INT_PTR itemindex = 0;itemindex < headerItemcount;itemindex++){
315                                 
316                 m_header.GetItemRect(itemindex,&headerItemRect);
317                 viewproperty.headerholSize[itemindex] = headerItemRect.right - headerItemRect.left;
318         }
319         commentlist.OnDestroy();
320         m_header.DestroyWindow();
321         m_commentListWindow.DestroyWindow();
322         return;
323
324 }
325
326 LRESULT CCommentView::OnHeaderEndDrag(LPNMHDR lParam){
327
328         if(lParam->hwndFrom == m_header.m_hWnd){
329                 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
330                 
331                         m_commentListWindow.Invalidate();
332                         m_commentListWindow.Unlock();
333                 }
334
335         }
336
337         return 0;
338 }
339
340
341 VOID CCommentView::OnHScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
342
343                         
344         INT_PTR dy;
345         SCROLLINFO hScrollInfo = {0};
346         hScrollInfo.cbSize = sizeof(hScrollInfo);
347         hScrollInfo.fMask = SIF_ALL;
348         this->GetScrollInfo(SB_HORZ,&hScrollInfo);
349         switch(loWParam){
350
351         case SB_THUMBPOSITION:
352         case SB_THUMBTRACK:
353                 dy = hiWParam - hScrollInfo.nPos;
354                 break;
355
356         case SB_LINELEFT:
357         case SB_PAGELEFT:
358
359                 dy = -1 * hScrollInfo.nPage;
360
361                 break;
362
363         case SB_LINERIGHT:
364         case SB_PAGERIGHT:
365
366                 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;
367
368                 break;
369
370         default:
371                 dy = 0;
372                 break;
373
374         }
375         
376         dy = max(-1 * hScrollInfo.nPos, min(dy, hScrollInfo.nMax - hScrollInfo.nPos));
377
378
379         if(dy != 0){
380                 hScrollInfo.nPos += dy;
381                 INT_PTR moveRange = -(hScrollInfo.nPos);
382
383                 HDWP hDwp = BeginDeferWindowPos(2);
384
385                 m_header.DeferWindowPos(hDwp,m_header.m_hWnd,moveRange,0,0,0,SWP_NOSIZE | SWP_NOZORDER);
386                 m_commentListWindow.DeferWindowPos(hDwp,m_commentListWindow.m_hWnd,moveRange,commentViewConstant::HEADER_HAIGHT,0,0,SWP_NOSIZE | SWP_NOZORDER);         
387
388                 EndDeferWindowPos(hDwp);
389                                         
390                                         
391                 this->SetScrollInfo(SB_HORZ,&hScrollInfo);
392         }
393                         
394         return;
395 }
396
397
398 VOID CCommentView::OnVScroll(INT_PTR loWParam,SHORT hiWParam,HWND lParam){
399
400         INT_PTR dy;
401         SCROLLINFO vScrollInfo = {0};
402         vScrollInfo.fMask = SIF_ALL;
403
404         
405         this->GetScrollInfo(SB_VERT,&vScrollInfo);
406
407         switch(loWParam){
408
409
410         case SB_THUMBPOSITION:
411         case SB_THUMBTRACK:
412
413                 dy = hiWParam - vScrollInfo.nPos;
414
415                 break;
416
417         case SB_LINEUP:
418
419                 dy = -1;
420                 break;
421
422         case SB_LINEDOWN:
423
424                 dy = 1;
425
426                 break;
427
428         case SB_PAGEUP:
429
430                 dy = -1 * vScrollInfo.nPage;
431
432                 break;
433
434         case SB_PAGEDOWN:
435
436                 dy = vScrollInfo.nPage;
437
438                 break;
439
440
441         case SB_TOP:
442
443                 dy = -vScrollInfo.nPos;
444
445                 break;
446
447         case SB_BOTTOM:
448
449                 dy = vScrollInfo.nMax;
450
451                 break;
452
453         default:
454
455                 dy = 0;
456
457                 break;
458
459         }
460
461         //dy = max(-1 * vScrollInfo.nPos, min(dy, vScrollInfo.nMax - (vScrollInfo.nMax + (INT_PTR)vScrollInfo.nPos)));
462
463
464         if(dy != 0){
465
466                 vScrollInfo.nPos += dy;
467 //              viewStartHeight = vScrollInfo.nPos;
468                 this->SetScrollPos(SB_VERT,vScrollInfo.nPos);
469                 //this->SetScrollInfo(SB_VERT,&vScrollInfo);
470                 this->UpdateWindow();
471                 if(TryEnterCriticalSection(&m_commentListWindow.m_sec) == TRUE){
472                         m_commentListWindow.Invalidate();
473                         m_commentListWindow.Unlock();
474                 }
475         }
476
477         
478                 
479         return;
480 }
481
482 LRESULT CCommentView::OnCreate(LPCREATESTRUCT lpcs){
483         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);
484         m_commentListWindow.Create(m_hWnd,0,commentViewConstant::NLITE_COMMENTLISTWINDOW,WS_CHILD | WS_VISIBLE  | WS_CLIPCHILDREN  , 0,commentViewConstant::LISTBOX_ID);
485         
486         
487         
488         
489         return 0;
490 }
491
492 VOID CCommentView::AddHeader(LPHEADERSINFO infos){
493
494
495         m_header.SetFont(hHeaderFontNew);
496
497         HDITEM item;
498         item.mask = HDI_FORMAT | HDI_TEXT | HDI_WIDTH;
499         item.fmt = HDF_CENTER | HDF_STRING;
500                         
501                         
502         for(UINT_PTR index = 0;index < infos->count ;++index){
503
504                 item.pszText = infos->columns[index];
505
506                 item.cxy =  infos->holizensize[index];
507                 m_header.AddItem(&item);
508         }
509
510         RECT itemRect;
511         INT_PTR nMax = 0;
512         UINT_PTR itemCount = m_header.GetItemCount();
513         for(UINT_PTR u_index = 0;u_index < itemCount;++u_index){
514
515                 m_header.GetItemRect(u_index,&itemRect);
516                 nMax += itemRect.right - itemRect.left;
517
518         }
519         
520         this->SetScrollRange(SB_HORZ,0,nMax,TRUE);
521         
522         DecisionHorzSize();
523         return;
524 }
525
526 VOID CCommentView::DecisionHorzSize(){
527         
528         HDWP hWindowPosInfo = BeginDeferWindowPos(2);
529         RECT bkWindowRect;
530         this->GetClientRect(&bkWindowRect);
531         m_header.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
532         m_commentListWindow.DeferWindowPos(hWindowPosInfo,m_header.m_hWnd,0,0,::GetSystemMetrics(SM_CXFULLSCREEN),bkWindowRect.bottom - commentViewConstant::HEADER_HAIGHT,SWP_NOZORDER | SWP_NOMOVE);
533
534         EndDeferWindowPos(hWindowPosInfo);
535                         
536         return;
537 }
538
539
540
541
542 //
543 //\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
544 ////////////////////////////////////////////////////////////////////
545
546 CCommentListWindow::CCommentListWindow(CCommentView &in_self):
547         self(in_self)
548         {}
549
550 CCommentListWindow::~CCommentListWindow(){
551 }
552
553
554 VOID CCommentListWindow::OnPaint(HDC in_hdc){
555
556         
557         
558         RECT windowRect;
559
560         RECT clientRect;
561         
562         self.GetClientRect(&clientRect);
563         clientRect.bottom -= commentViewConstant::HEADER_HAIGHT;
564
565         this->GetWindowRect(&windowRect);
566         windowRect.right -= windowRect.left;
567         windowRect.bottom -= windowRect.top;
568         windowRect.left = 0;
569         windowRect.top = 0;
570         RECT listRect = windowRect;
571         listRect.right = self.GetColumnHolSizeSum();
572         CPaintDC pdc(*this);
573         
574         {
575                 CMemoryDC mdc(pdc,windowRect);
576                 mdc.SelectFont(AtlGetDefaultGuiFont());
577                 mdc.FillRect(&clientRect,(HBRUSH)::GetStockObject(GRAY_BRUSH));
578
579                 CCommentList &commentList = self.commentlist;
580
581                 BOOL selectFlag = FALSE;
582                 CCommentList::iterator selectData;
583                 RECT selectRect = {0};
584                 UINT_PTR viewStartHeight = self.GetScrollPos(SB_VERT);
585                 
586         
587                 if(commentList.Size() > (UINT_PTR)viewStartHeight){
588
589         
590                         
591                         CCommentList::iterator chatData = commentList.begin();
592                         std::advance(chatData,viewStartHeight);
593                 
594
595
596                         CBrush baseBkBrush;
597                         baseBkBrush.CreateSolidBrush(self.viewproperty.backColor);
598                         mdc.FillRect(&listRect,baseBkBrush);
599                         baseBkBrush.DeleteObject();
600                         CCommentList::iterator endData = commentList.end();
601                         listRect.bottom = 0;
602
603                         CPen outLinePen;
604                         outLinePen.CreatePen(PS_SOLID,1,ColorList::outLineNomal);
605                         mdc.SelectPen(outLinePen);
606                         mdc.MoveTo(listRect.right,listRect.top);
607                         mdc.LineTo(listRect.right,listRect.bottom);
608
609
610                         for(;chatData != endData && listRect.top < clientRect.bottom;++chatData){
611                                 listRect.bottom +=      CalcItemHeight(*chatData);
612
613                                 
614                                 if(chatData->selectFlag == TRUE){
615                                         selectFlag = TRUE;
616                                         selectData = chatData;
617                                         selectRect = listRect;
618                                 } else {
619                                 
620                                         this->DrawItem(mdc,listRect,*chatData);
621                                 }
622                         
623                         
624                                 listRect.top = listRect.bottom;
625                         }
626
627                         mdc.SelectPen(outLinePen);
628                         mdc.MoveTo(listRect.left,listRect.bottom);
629                         mdc.LineTo(listRect.right,listRect.bottom);
630                         
631                         if(selectFlag == TRUE){
632                                 this->DrawItem(mdc,selectRect,*selectData);
633                         }
634
635                 }
636
637         
638         
639         
640         }
641
642         
643
644         
645         return;
646 }
647
648 VOID CCommentListWindow::OnSize(UINT wParam, _WTYPES_NS::CSize &windowSize){
649
650         
651         SCROLLINFO vScrollInfo = {0};
652         vScrollInfo.fMask = SIF_ALL;
653
654
655         self.GetScrollInfo(SB_VERT,&vScrollInfo);
656         BOOL scrollFlag = (UINT)(vScrollInfo.nPage + vScrollInfo.nPos + 1) >= (UINT)vScrollInfo.nMax;
657         vScrollInfo.nPage = CalcScrollPage();
658         
659         vScrollInfo.fMask = SIF_PAGE;
660         self.SetScrollInfo(SB_VERT,&vScrollInfo);
661
662         
663         
664         if(scrollFlag == TRUE){
665                 self.SendMessageW(WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);
666         }
667
668         this->Invalidate();
669         
670         return;
671 }
672
673
674 UINT_PTR CCommentListWindow::CalcScrollPage(){
675         
676         RECT clientRect;
677         INT_PTR rslt = 0;
678         LONG height = 0;
679         this->GetClientRect(&clientRect);
680         
681         SCROLLINFO vScrollInfo = {0};
682         if(self.commentlist.empty() != TRUE){
683                 
684                 CCommentList::reverse_iterator rbegin = self.commentlist.rbegein();
685                 CCommentList::reverse_iterator rend = self.commentlist.rend();
686                 for(;rbegin != rend;++rbegin){
687
688                         height += CalcItemHeight(*rbegin);
689                         rslt++;
690                         if(height > clientRect.bottom)goto overclientrect;
691                         
692                 }
693         }
694         
695         vScrollInfo.fMask = SIF_RANGE;
696         self.GetScrollInfo(SB_VERT,&vScrollInfo);
697         rslt = vScrollInfo.nMax + 1;
698
699         
700 overclientrect:
701
702         return rslt;
703 }
704
705 VOID CCommentListWindow::DrawItem(CDC &dc,RECT &rc,CChatData &chatData){
706
707         
708         RECT noViewRect;
709         RECT userNameViewRect;
710         RECT timeViewRect;
711         RECT chatViewRect;
712         RECT infoViewRect;
713
714         time_t chatTime = (time_t)difftime(chatData.date,self.streamStatus.start_time);
715         tm ct = *gmtime(&chatTime);
716         
717         TCHAR noString[sizeof(chatData.no) * 8]; 
718         TCHAR dateString[LENGTH_16];
719         _stprintf(noString,TEXT("%u"),chatData.no);
720
721         _tcsftime(dateString,ARRAY_LENGTH(dateString),ct.tm_hour != 0 ? TEXT("%H:%M:%S") : TEXT("%M:%S"),&ct);
722
723         COLORREF bkColor;
724         COLORREF outLineColor;
725         
726         CPen outLinePen;
727         CPen colLinePen;
728         CBrush bkBrush;
729         colLinePen.CreatePen(PS_SOLID,1,ColorList::colLine);
730         
731         
732         //\91I\91ð\8fó\91Ô\82©\83`\83F\83b\83N
733         if (chatData.selectFlag == TRUE)
734         {
735                 bkColor = ColorList::selectBack;
736                 outLineColor = ColorList::outLineSelect;
737                 
738                 
739         }
740         else  
741         {
742                 
743                 outLineColor = ColorList::outLineNomal;
744
745                 if(chatData.listenerData->originBkFlag == TRUE){
746                         
747                         bkColor = chatData.listenerData->bkColor;
748                         
749                         
750                 } else {
751                         
752                         bkColor = self.viewproperty.backColor;
753                         
754                         
755                         
756                 }
757         }
758
759         outLinePen.CreatePen(PS_SOLID,1,outLineColor);
760         bkBrush.CreateSolidBrush(bkColor);
761         dc.SelectPen(outLinePen);
762         
763         if(chatData.selectFlag == TRUE){
764                 
765                 dc.MoveTo(rc.left,rc.bottom);
766                 dc.LineTo(rc.right,rc.bottom);
767         }
768         dc.FillRect(&rc,bkBrush);
769         dc.SetBkColor(bkColor);
770         dc.MoveTo(rc.left,rc.top);
771         dc.LineTo(rc.right,rc.top);
772         
773         
774         
775         dc.SetTextColor(self.viewproperty.baseStringColor);
776         
777         
778         
779         
780
781         //\95`\89æ\83T\83C\83Y\82ð\8cv\8eZ
782         
783         self.m_header.GetItemRect(CCommentView::NO,&noViewRect);
784         self.m_header.GetItemRect(CCommentView::USERNAME,&userNameViewRect);
785         self.m_header.GetItemRect(CCommentView::COMMENT,&chatViewRect);
786         self.m_header.GetItemRect(CCommentView::TIME,&timeViewRect);
787         self.m_header.GetItemRect(CCommentView::INFO,&infoViewRect);
788
789         noViewRect.left += 2;
790         userNameViewRect.left += 2;
791         timeViewRect.left += 2;
792         chatViewRect.left += 2;
793         infoViewRect.left += 2;
794
795         noViewRect.right -= 2;
796         userNameViewRect.right -= 2;
797         timeViewRect.right -= 2;
798         chatViewRect.right -= 2;
799         infoViewRect.right -= 2;
800         
801         noViewRect.top = rc.top + 2;
802         userNameViewRect.top = rc.top + 2;
803         timeViewRect.top = rc.top + 2;
804         chatViewRect.top = rc.top + 2;
805         infoViewRect.top = rc.top + 2;
806
807         noViewRect.bottom = rc.bottom - 2;
808         userNameViewRect.bottom = rc.bottom - 2;
809         timeViewRect.bottom = rc.bottom - 2;
810         chatViewRect.bottom = rc.bottom - 2;
811         infoViewRect.bottom = rc.bottom - 2;
812         
813         dc.SelectPen(colLinePen);
814
815         dc.MoveTo(noViewRect.right,rc.top);
816         dc.LineTo(noViewRect.right,rc.bottom);
817         dc.MoveTo(userNameViewRect.right,rc.top);
818         dc.LineTo(userNameViewRect.right,rc.bottom);
819         dc.MoveTo(chatViewRect.right,rc.top);
820         dc.LineTo(chatViewRect.right,rc.bottom);
821         dc.MoveTo(timeViewRect.right,rc.top);
822         dc.LineTo(timeViewRect.right,rc.bottom);
823
824         dc.DrawTextW(noString,_tcslen(noString),&noViewRect,DT_WORD_ELLIPSIS);
825         dc.DrawTextW(chatData.listenerData->user_id,chatData.listenerData->user_id.GetLength(),&userNameViewRect,DT_WORD_ELLIPSIS);
826         dc.DrawTextW(chatData.chatBuf,chatData.chatBuf.GetLength(),&chatViewRect,DT_WORDBREAK);
827         dc.DrawTextW(dateString,_tcslen(dateString),&timeViewRect,DT_WORD_ELLIPSIS);
828         
829         return;
830 }
831
832
833 UINT_PTR CCommentListWindow::CalcItemHeight(CChatData &chatData){
834
835         RECT drowSize;
836         self.m_header.GetItemRect(CCommentView::COMMENT,&drowSize);
837         drowSize.left += 2;
838         drowSize.top +=  2;
839         drowSize.right -= 2;
840         drowSize.bottom = 0;
841
842         CPaintDC pdc(*this);
843         pdc.SelectFont(AtlGetDefaultGuiFont());
844         ::DrawTextW(pdc,chatData.chatBuf,chatData.chatBuf.GetLength(),&drowSize, DT_CALCRECT | DT_WORDBREAK);
845         drowSize.top -= 2;
846         drowSize.bottom += 2;
847
848         return drowSize.bottom;
849 }
850
851
852 LRESULT CCommentListWindow::OnCreate(LPCREATESTRUCT lpCreateStruct){
853         
854         return 0;
855 }
856
857 INT_PTR CCommentListWindow::CalcClickLine(INT_PTR height){
858         SCROLLINFO vScrollInfo = {0};
859         vScrollInfo.fMask = SIF_POS;
860
861         self.GetScrollInfo(SB_VERT,&vScrollInfo);
862
863         INT_PTR heightSum = 0;
864         INT_PTR lineNo = vScrollInfo.nPos;
865         CCommentList::iterator chatData = self.commentlist.begin();
866         CCommentList::iterator end = self.commentlist.end();    
867         std::advance(chatData,vScrollInfo.nPos);
868         for(; chatData != end;++chatData){
869                 
870                 heightSum += CalcItemHeight(*chatData);
871
872                 if(heightSum >= height){
873
874                         goto end;
875                 }
876
877                 ++lineNo;
878         }
879         lineNo = -1;
880 end:
881
882
883         return lineNo;
884 }
885
886
887
888 VOID CCommentListWindow::OnLButtonDown(UINT wParam, _WTYPES_NS::CPoint &point){
889
890
891         
892         this->SetFocus();
893         if(self.commentlist.empty() == TRUE)return;
894         auto curselItem = self.commentlist.GetCurSelItem();
895         if(curselItem != self.commentlist.end()){
896                 curselItem->selectFlag = FALSE;
897         }
898         self.commentlist.SetCurSel(CalcClickLine(point.y));
899         if(TryEnterCriticalSection(&this->m_sec) == TRUE){
900                 this->Invalidate();
901                 this->Unlock();
902         }
903         return;
904 }
905
906
907 VOID CCommentListWindow::OnLButtonDbClk(UINT wParam, _WTYPES_NS::CPoint &point){
908
909         
910
911         
912         this->SetFocus();
913         if(self.commentlist.empty() == TRUE)return;
914                 
915         auto chatData = self.commentlist.GetChatAt(CalcClickLine(point.y));
916         COLORREF bkColor;
917         if(chatData.listenerData->originBkFlag == FALSE){
918                 CListenerColorCollector colorCollector;
919                 listenerList.BkColorCollect(colorCollector);
920                 UCHAR red;
921                 UCHAR green;
922                 UCHAR blue;
923                 
924                 srand((unsigned int)time(NULL));
925                 do{
926
927                         red = getrgb();
928                         green = getrgb();
929                         blue = getrgb();
930                         bkColor = RGB(red,green,blue);
931
932                 }while(colorCollector.Find(bkColor));
933                 
934                 chatData.listenerData->originBkFlag = TRUE;
935                 chatData.listenerData->SetBkColor(bkColor);
936         } else {
937
938                 
939                 chatData.listenerData->originBkFlag = FALSE;
940         }
941
942         
943         
944
945         
946
947         if(TryEnterCriticalSection(&this->m_sec) == TRUE){
948                 this->Invalidate(TRUE);
949                 this->Unlock();
950         }
951         
952         
953         
954         
955         return;
956 }
957
958 LRESULT CCommentListWindow::OnEraseBkGnd(HDC lparam){
959
960         return TRUE;
961 }
962
963 LRESULT CCommentListWindow::OnMouseWheel(UINT loWparam,SHORT hiWparam,CPoint &point){
964
965         
966         self.SendMessageW(WM_VSCROLL,MAKELONG(hiWparam < 0 ? SB_PAGEDOWN : SB_PAGEUP ,0),0);
967
968
969         return 0;
970 }
971
972
973
974 }