|
|
1.1 root 1: #include <afxwin.h>
2: #include <afxdlgs.h>
3: #include <afxcoll.h>
4: #include <string.h>
5:
6: #include "types.h"
7: #include "resource.h"
8: #include "ranges.h"
9: #include "list.h"
10: #include "listwin.h"
11:
12:
13: #define PAGESIZE 8
14:
15: /*********************** GLOBAL DATA *****************************/
16:
17: extern LOGFONT DefaultFont;
18: extern HCURSOR HCursorSizer;
19: extern HCURSOR HCursorNormal;
20: extern HICON HIconList;
21:
22:
23: /*********************** CListWnd implementation **********************/
24:
25: BEGIN_MESSAGE_MAP(CListWnd, CMDIChildWnd)
26: ON_WM_CREATE()
27: ON_WM_DESTROY()
28: ON_WM_MDIACTIVATE()
29: ON_WM_KEYDOWN()
30: ON_WM_LBUTTONDBLCLK()
31: ON_WM_LBUTTONDOWN()
32: ON_WM_LBUTTONUP()
33: ON_WM_MOUSEMOVE()
34: ON_WM_PAINT()
35: ON_WM_SIZE()
36: ON_WM_VSCROLL()
37:
38: ON_COMMAND( VK_UP, OnUp )
39: ON_COMMAND( VK_DOWN, OnDown )
40: ON_COMMAND( IDM_LIST_FONT, OnFont )
41: ON_COMMAND( IDM_LIST_RANGES, OnRanges )
42: ON_COMMAND( IDM_LIST_ALPHA, OnSortAlpha )
43: ON_COMMAND( IDM_LIST_CALLS, OnSortCalls )
44: ON_COMMAND( IDM_LIST_TIME, OnSortTime )
45: ON_COMMAND( IDM_LIST_PER_CALL, OnSortTimePer)
46: ON_COMMAND( IDM_LIST_CHILDREN, OnChildren)
47: END_MESSAGE_MAP()
48:
49: BOOL CListWnd::Create(LPCSTR szTitle, LONG style, const RECT& rect,
50: CMDIFrameWnd* parent)
51: {
52: const char * pszStockClass = AfxRegisterWndClass(
53: CS_HREDRAW | CS_VREDRAW, NULL,
54: (HBRUSH) (COLOR_WINDOW+1), HIconList);
55:
56: rgl[0] = 0;
57: rgl[1] = 150;
58: rgl[2] = 200;
59: rgl[3] = 250;
60: rgl[4] = 300;
61: rgl[5] = 350;
62: rgl[6] = 400;
63: rgl[7] = 450;
64: rgl[8] = 500;
65: rgl[9] = 550;
66: rgl[10] = 600;
67: m_cxClient = 600;
68: fCapture = FALSE;
69:
70: return CMDIChildWnd::Create(pszStockClass, szTitle, style, rect, parent);
71: }
72:
73:
74: CListWnd::CListWnd()
75: {
76: int i;
77:
78: m_pMenuCurrent = NULL;
79: m_bWindowActive = FALSE;
80: m_SortOrder = LIST_ALPHA;
81: logFont = DefaultFont;
82: fChildren = FALSE;
83:
84: for (i=0; i<MAX_NUM_RANGES; i++) {
85: rs.TextColor[i] = 0;
86: rs.BackColor[i] = RGB( 0, 0, 0);
87: rs.Above[i] = 101;
88: }
89:
90: rs.Above[0] = 0; rs.BackColor[0] = RGB( 0, 0, 255);
91: rs.TextColor[0] = 1;
92: rs.Above[1] = 1; rs.BackColor[1] = RGB( 0, 255, 0);
93: rs.Above[2] = 2; rs.BackColor[2] = RGB( 0, 255, 255);
94: rs.Above[3] = 5; rs.BackColor[3] = RGB( 255, 255, 0);
95: rs.Above[4] = 20; rs.BackColor[4] = RGB( 255, 0, 0);
96: rs.Above[5] = 101;
97: rs.cRanges = 5;
98:
99: ratio = 0.33;
100:
101: return;
102: } /* CListWnd::CListWnd() */
103:
104: CListWnd::~CListWnd()
105: {
106: if (m_bWindowActive) {
107: m_pMenuCurrent->Detach();
108: }
109: }
110:
111: void CListWnd::EndTiming()
112: {
113: m_ListHead.SortByTotalTime();
114: m_ListHead.SortByPerTime();
115: m_ListHead.SortByCallCount();
116: m_ListHead.SortByTPerTime();
117: m_ListHead.SortByTimeAll();
118: pRight->ComputeWidths();
119: pLeft->ComputeWidths();
120: return;
121: }
122:
123: void CListWnd::InvalidateLine()
124: {
125: CRect area(0, (m_nSelectLine - m_nVscrollPos ) * m_cyChar,
126: m_cxClient, (m_nSelectLine + 1 - m_nVscrollPos) * m_cyChar);
127: InvalidateRect( area );
128: }
129:
130: int CListWnd::OnCreate(LPCREATESTRUCT p)
131: {
132: TEXTMETRIC tm;
133:
134: CDC * dc = GetDC();
135: dc->GetTextMetrics( &tm );
136: ReleaseDC( dc );
137:
138: m_cxChar = tm.tmAveCharWidth;
139: m_cxCaps = ( (tm.tmPitchAndFamily & 1) ? 3 : 2) * m_cxChar / 2;
140: m_cyChar = tm.tmHeight + tm.tmExternalLeading;
141: m_nMaxWidth = ( 20 ) * m_cxCaps;
142: m_nVscrollPos = 0;
143:
144: /*
145: */
146:
147: pLeft = new CListWndLeft;
148: pLeft->Create(WS_HSCROLL|WS_VISIBLE, rectDefault, this);
149:
150: pRight = new CListWndRight;
151: pRight->Create(WS_HSCROLL|WS_VISIBLE, rectDefault, this);
152:
153: return 0;
154: }
155:
156:
157: void CListWnd::OnDestroy()
158: {
159: // m_pMDIFrameWnd->SendMessage(WM_CHILDDESTROY, (UINT)m_hWnd, 0);
160: return;
161: }
162:
163:
164: void CListWnd::OnSize(UINT nType, int cx, int cy)
165: {
166: int cxOld = m_cxClient;
167: int i;
168:
169: i = (int) (cx*ratio);
170: pLeft->MoveWindow(0, 0, i-1, cy);
171: pRight->MoveWindow(i+2, 0, cx-(i+2), cy);
172:
173: /*
174: * Now set the scroll ranges
175: */
176:
177: m_cxClient = cx;
178: m_cyClient = max(cy, 1);
179:
180: m_nVscrollMax = max( 0, (int)( m_ListHead.GetCount() ) - m_cyClient / m_cyChar );
181: m_nVscrollPos = min( m_nVscrollPos, m_nVscrollMax );
182:
183: SetScrollRange( SB_VERT, 0, m_nVscrollMax, FALSE );
184: SetScrollPos( SB_VERT, m_nVscrollPos, TRUE );
185:
186: CMDIChildWnd::OnSize(nType, cx, cy);
187:
188: return;
189: }
190:
191: void CListWnd::OnMDIActivate(BOOL bActivate, CWnd * pActive,
192: CWnd* pDeactivate)
193: {
194: CMDIFrameWnd * pFrame = m_pMDIFrameWnd;
195: CMenu * pWinPopupMenu = NULL;
196: CMenu * pMenu = NULL;
197:
198: m_bWindowActive = bActivate;
199:
200: if (bActivate) {
201: pMenu = new CMenu;
202: pMenu->LoadMenu("MdiMenuList");
203: pWinPopupMenu = pMenu->GetSubMenu(LISTWIN_MENU_POSITION);
204:
205: CMenu * pLastMenu = pFrame->MDISetMenu(pMenu,pWinPopupMenu);
206: pLastMenu->DestroyMenu();
207:
208: delete m_pMenuCurrent;
209: m_pMenuCurrent = pMenu;
210: } else {
211: pMenu = new CMenu;
212: pMenu->LoadMenu("MdiMenuInit");
213: pWinPopupMenu = pMenu->GetSubMenu(INIT_MENU_POS);
214:
215: CMenu * pLastMenu = pFrame->MDISetMenu(pMenu, pWinPopupMenu);
216: pLastMenu->DestroyMenu();
217:
218: delete m_pMenuCurrent;
219: m_pMenuCurrent = pMenu;
220: }
221:
222: pFrame->DrawMenuBar();
223: }
224:
225: void CListWnd::OnPaint()
226: {
227: CPaintDC dc (this);
228: CRect rt;
229: CBrush b(RGB(0, 0, 0));
230:
231: dc.FillRect(&dc.m_ps.rcPaint, &b);
232:
233: return;
234: }
235:
236: void CListWnd::OnVScroll(UINT wParam, UINT pos, CScrollBar * p)
237: {
238: pLeft->OnVScroll(wParam, pos, p);
239: m_nVscrollPos = pRight->OnVScroll(wParam, pos, p);
240: SetScrollPos( SB_VERT, m_nVscrollPos );
241:
242: return;
243: }
244:
245: void CListWnd::OnUp()
246: {
247: InvalidateLine();
248:
249: if ( m_nSelectLine <= 0 ) {
250: m_nSelectLine = m_ListHead.GetCount() - 1;
251: m_nVscrollPos = max( 0, m_nSelectLine + 1 - ( m_cyClient / m_cyChar ) );
252: Invalidate( TRUE );
253: } else {
254: m_nSelectLine -= 1;
255: if (m_nSelectLine - m_nVscrollPos < 0) {
256: OnVScroll( SB_LINEUP, 0, NULL );
257: }
258:
259: if (m_nSelectLine - m_nVscrollPos > (m_cyClient / m_cyChar ) ) {
260: m_nVscrollPos = m_nSelectLine + 1 - (m_cyClient / m_cyChar);
261: SetScrollPos( SB_VERT, m_nVscrollPos, TRUE );
262: Invalidate( TRUE );
263: }
264: if (m_nSelectLine - m_nVscrollPos < 0) {
265: m_nVscrollPos = m_nSelectLine;
266: SetScrollPos( SB_VERT, m_nVscrollPos, TRUE );
267: Invalidate( TRUE );
268: }
269: }
270:
271: InvalidateLine();
272: }
273:
274: void CListWnd::OnDown()
275: {
276:
277: InvalidateLine();
278:
279: if (( m_nSelectLine == (int)(m_ListHead.GetCount() - 1 )) ||
280: (m_nSelectLine == -1)) {
281: m_nSelectLine = 0;
282: m_nVscrollPos = 0;
283: Invalidate( TRUE );
284: } else {
285: m_nSelectLine += 1;
286: if ((m_nSelectLine - m_nVscrollPos + 1) > (m_cyClient/m_cyChar)) {
287: OnVScroll( SB_LINEDOWN, 0, NULL );
288: }
289:
290: if (m_nSelectLine - m_nVscrollPos > (m_cyClient / m_cyChar ) ) {
291: m_nVscrollPos = m_nSelectLine + 1 - (m_cyClient / m_cyChar);
292: SetScrollPos( SB_VERT, m_nVscrollPos, TRUE );
293: Invalidate( TRUE );
294: }
295: if (m_nSelectLine - m_nVscrollPos < 0) {
296: m_nVscrollPos = m_nSelectLine;
297: SetScrollPos( SB_VERT, m_nVscrollPos, TRUE );
298: Invalidate( TRUE );
299: }
300: }
301:
302: InvalidateLine();
303: }
304:
305: void CListWnd::OnKeyDown( UINT wParam, UINT, UINT )
306: {
307: switch( wParam ) {
308: case VK_HOME:
309: OnVScroll( SB_TOP, 0, NULL );
310: break;
311: case VK_END:
312: OnVScroll( SB_BOTTOM, 0, NULL );
313: break;
314:
315: case VK_PRIOR:
316: OnVScroll( SB_PAGEUP, 0, NULL );
317: break;
318:
319: case VK_NEXT:
320: OnVScroll( SB_PAGEDOWN, 0, NULL );
321: break;
322:
323: case VK_LEFT:
324: OnHScroll( SB_PAGEUP, 0, NULL );
325: break;
326:
327: case VK_RIGHT:
328: OnHScroll( SB_PAGEDOWN, 0, NULL );
329: break;
330: }
331: }
332:
333: void CListWnd::OnLButtonDblClk( UINT wParam, CPoint location )
334: {
335: #if 0
336: if (m_nSelectLine == -1) {
337: OnLButtonDown( wParam, location );
338: }
339: OnEdit();
340: #endif
341: }
342:
343:
344:
345: afx_msg void CListWnd::OnSortAlpha()
346: {
347: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_UNCHECKED);
348: m_SortOrder = LIST_ALPHA;
349: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_CHECKED);
350: Invalidate(TRUE);
351: return;
352: } /* CListWnd::OnSortAlpha() */
353:
354: afx_msg void CListWnd::OnSortCalls()
355: {
356: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_UNCHECKED);
357: m_SortOrder = LIST_CALLS;
358: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_CHECKED);
359: Invalidate(TRUE);
360: return;
361: } /* CListWnd::OnSortCalls() */
362:
363: afx_msg void CListWnd::OnSortTime()
364: {
365: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_UNCHECKED);
366: m_SortOrder = fChildren ? LIST_TIME_TOTAL : LIST_TIME;
367: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_CHECKED);
368: Invalidate(TRUE);
369: return;
370: } /* CListWnd::OnSortTime() */
371:
372: afx_msg void CListWnd::OnSortTimePer()
373: {
374: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_UNCHECKED);
375: m_SortOrder = fChildren ? LIST_PER_TIME_TOTAL : LIST_PER_TIME;
376: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_CHECKED);
377: Invalidate(TRUE);
378: return;
379: } /* CListWnd::OnSortTimePer() */
380:
381: void CListWnd::OnRanges()
382: {
383: CFont cFont;
384: CFont * lpcFont;
385:
386: DoRangesDlg(this, &rs);
387:
388: CClientDC cdc( this );
389:
390: cFont.CreateFontIndirect(&logFont);
391: lpcFont = cdc.SelectObject(&cFont);
392: // pTimerObj->AssignSizes( &cdc, fZoom, 0, &rs);
393: // SetRect( pTimerObj->AssignLocations()) ;
394: cdc.SelectObject(lpcFont);
395:
396: Invalidate(TRUE);
397:
398: return;
399: } /* CListWnd::OnRanges() */
400:
401: void CListWnd::OnFont()
402: {
403: CFontDialog fontDlg(&logFont);
404:
405: if (fontDlg.DoModal()) {
406:
407: pRight->ComputeWidths();
408: pLeft->ComputeWidths();
409: }
410: return;
411: } /* CListWnd::OnFont() */
412:
413: afx_msg void CListWnd::OnLButtonDown(UINT nFlags, CPoint pt)
414: {
415: CClientDC dc(this);
416:
417: fCapture = TRUE;
418: SetCapture();
419: rtCapture.SetRect(pt.x-1, 0, pt.x+1, m_cyClient);
420: dc.InvertRect(&rtCapture);
421: return;
422: } /* CListWnd::OnLButtonDown() */
423:
424: afx_msg void CListWnd::OnLButtonUp(UINT nFlags, CPoint pt)
425: {
426: int x;
427:
428: if (fCapture) {
429: ReleaseCapture();
430: fCapture = FALSE;
431: x = min(max(pt.x, 10), m_cxClient-10);
432: ratio = ((float) x) / (float)m_cxClient;
433:
434: pLeft->MoveWindow(0, 0, x-1, m_cyClient);
435: pRight->MoveWindow(x+2, 0, m_cxClient-(x+2), m_cyClient);
436: } else {
437: CWnd::OnLButtonUp(nFlags, pt);
438: }
439: } /* CListWnd::OnLButtonDown() */
440:
441: afx_msg void CListWnd::OnMouseMove(UINT nFlags, CPoint pt)
442: {
443: if (!fCapture) {
444:
445: SetCursor(HCursorSizer);
446:
447: } else {
448: CClientDC dc(this);
449: int x = min(max(pt.x, 10), m_cxClient-10);
450:
451: dc.InvertRect(&rtCapture);
452: rtCapture.SetRect(x-1, 0, x+1, m_cyClient);
453: dc.InvertRect(&rtCapture);
454: }
455: } /* CListWnd::OnMouseMove() */
456:
457: afx_msg void CListWnd::OnChildren()
458: {
459: fChildren = !fChildren;
460: if (m_SortOrder == LIST_TIME) {
461: m_SortOrder = LIST_TIME_TOTAL;
462: } else if (m_SortOrder == LIST_TIME_TOTAL) {
463: m_SortOrder = LIST_TIME;
464: } else if (m_SortOrder == LIST_PER_TIME) {
465: m_SortOrder = LIST_PER_TIME_TOTAL;
466: } else if (m_SortOrder == LIST_PER_TIME_TOTAL) {
467: m_SortOrder = LIST_PER_TIME;
468: }
469: m_pMenuCurrent->CheckMenuItem(IDM_LIST_CHILDREN, MF_BYCOMMAND | (fChildren ? MF_CHECKED : MF_UNCHECKED));
470: Invalidate(TRUE);
471: return;
472: } /* CListWnd::OnChildren() */
473:
474:
475:
476:
477: /**********************************************************************/
478:
479: BOOL CListWndChild::Create(DWORD style, const RECT& rect, CListWnd * parent)
480: {
481: const char * pszStockClass;
482:
483: pszStockClass = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW, NULL,
484: (HBRUSH) (COLOR_WINDOW+1), NULL);
485:
486: pListWnd = parent;
487:
488: return CWnd::Create(pszStockClass, "A", style, rect, parent, 999);
489:
490:
491: } /* CListWndChild::Create() */
492:
493: int CListWndChild::OnCreate(LPCREATESTRUCT p)
494: {
495: // ComputeWidths();
496:
497: return 0;
498: } /* CListWndChild::OnCreate() */
499:
500: void CListWndChild::OnDestroy()
501: {
502: return;
503: } /* CListWndCHild::OnDestroy() */
504:
505:
506: void CListWndChild::OnSize(UINT nType, int cx, int cy)
507: {
508: m_cxClient = cx;
509: m_cyClient = cy;
510:
511: SetScrollRange(SB_HORZ, 0, max(1, m_nHscrollMax - cx), TRUE);
512:
513: m_nVscrollMax = max(1, (int)(ListHead()->GetCount())-m_cyClient/m_cyChar);
514:
515: CWnd::OnSize(nType, cx, cy);
516:
517: return;
518: } /* CListWndChild::OnSize() */
519:
520: void CListWndChild::OnHScroll(UINT wParam, UINT pos, CScrollBar *)
521: {
522: int nScrollInc;
523:
524: switch( wParam ) {
525: case SB_LEFT:
526: nScrollInc = -m_nVscrollPos;
527: break;
528:
529: case SB_RIGHT:
530: nScrollInc = m_cxClient;
531: break;
532:
533: case SB_LINELEFT:
534: nScrollInc = -1;
535: break;
536:
537: case SB_LINERIGHT:
538: nScrollInc = 1;
539: break;
540:
541: case SB_PAGELEFT:
542: nScrollInc = -m_cxClient;
543: break;
544:
545: case SB_PAGERIGHT:
546: nScrollInc = m_cxClient;
547: break;
548:
549: case SB_THUMBTRACK:
550: nScrollInc = pos - m_nHscrollPos;
551: break;
552:
553: default:
554: nScrollInc = 0;
555: }
556:
557: nScrollInc = max( -m_nHscrollPos,
558: min(nScrollInc,
559: (m_nHscrollMax - m_cxClient) - m_nHscrollPos ));
560: if (nScrollInc) {
561: m_nHscrollPos += nScrollInc;
562: SetScrollPos( SB_HORZ, m_nHscrollPos );
563: ScrollWindow( -nScrollInc, 0);
564: UpdateWindow();
565: }
566: return;
567: } /* CListWndChild::OnHScroll() */
568:
569: int CListWndChild::OnVScroll(UINT wParam, UINT pos, CScrollBar *)
570: {
571: int nScrollInc;
572:
573: switch( wParam ) {
574: case SB_TOP:
575: nScrollInc = -m_nVscrollPos;
576: break;
577:
578: case SB_BOTTOM:
579: nScrollInc = m_nVscrollMax;
580: break;
581:
582: case SB_LINEUP:
583: nScrollInc = -1;
584: break;
585:
586: case SB_LINEDOWN:
587: nScrollInc = 1;
588: break;
589:
590: case SB_PAGEUP:
591: nScrollInc = min( -1, -(m_cyClient/m_cyChar - 2));
592: break;
593:
594: case SB_PAGEDOWN:
595: nScrollInc = max( 1, m_cyClient/m_cyChar - 2);
596: break;
597:
598: case SB_THUMBTRACK:
599: nScrollInc = pos - m_nVscrollPos;
600: break;
601:
602: default:
603: nScrollInc = 0;
604: break;
605: }
606:
607: nScrollInc = max( -m_nVscrollPos,
608: min( nScrollInc, m_nVscrollMax - m_nVscrollPos ) );
609:
610: if (nScrollInc) {
611: CRect rt(0, 2*m_cyChar+1, m_cxClient, m_cyClient);
612: m_nVscrollPos += nScrollInc;
613: ScrollWindow( 0, -m_cyChar * nScrollInc, NULL, &rt );
614: UpdateWindow();
615: }
616:
617: return m_nVscrollPos;
618: } /* CListWndChild::OnVScroll() */
619:
620:
621: afx_msg void CListWndChild::OnMouseMove(UINT nFlags, CPoint pt)
622: {
623: SetCursor(HCursorNormal);
624:
625: return;
626: } /* CListWndChild::OnMouseMove() */
627:
628:
629: /*********************************************************************/
630:
631: BEGIN_MESSAGE_MAP(CListWndLeft, CWnd)
632: ON_WM_CREATE()
633: ON_WM_DESTROY()
634: ON_WM_HSCROLL()
635: ON_WM_MOUSEMOVE()
636: ON_WM_PAINT()
637: ON_WM_SIZE()
638: END_MESSAGE_MAP()
639:
640:
641: void CListWndLeft::OnPaint()
642: {
643: CPaintDC dc(this);
644: CBrush b(RGB(255, 255, 255));
645:
646: CRect area(0, 0, m_cxClient, m_cyClient);
647:
648: int nStart;
649: int nEnd;
650:
651: nStart = max(dc.m_ps.rcPaint.top, 2*m_cyChar);
652: nStart = m_nVscrollPos + (nStart / m_cyChar) - 2;
653:
654: nEnd = min( ListHead()->GetCount(),
655: (dc.m_ps.rcPaint.bottom - dc.m_ps.rcPaint.top) / m_cyChar +
656: nStart + 2);
657:
658: int x = -m_nHscrollPos;
659: int y;
660: int perCent;
661: int j;
662: CRect rt;
663:
664: dc.FillRect( area, &b);
665:
666: dc.SetTextAlign( TA_CENTER | TA_TOP );
667: rt.SetRect(0, 0, m_cxClient, m_cyChar);
668: dc.ExtTextOut((m_cxClient-5)/2, 0, ETO_CLIPPED, &rt, "Name", 4, NULL);
669:
670: dc.SetTextAlign( TA_LEFT | TA_TOP );
671: dc.SetBkMode(TRANSPARENT);
672:
673: /*
674: * Print out the data
675: */
676:
677: CString szDisplay;
678: ListItem * pCur;
679:
680: for (y= (nStart - m_nVscrollPos + 2) * m_cyChar;
681: nStart < nEnd; nStart++, y += m_cyChar ) {
682: pCur = ListHead()->GetPosition( nStart, SortOrder());
683: perCent = (int) pCur->Time().PerCent(ListHead()->TotalTime());
684:
685: for (j=0; j<RangeStruct()->cRanges-1; j++) {
686: if ((RangeStruct()->Above[j] <= perCent) &&
687: (perCent < RangeStruct()->Above[j+1])) {
688: break;
689: }
690: }
691:
692: CBrush bBack( RangeStruct()->BackColor[j] );
693:
694: dc.SetTextColor( RangeStruct()->TextColor[j] * RGB(255, 255, 255));
695:
696: area.top = y;
697: area.bottom = y + m_cyChar;
698: dc.FillRect( area, &bBack );
699:
700: /*
701: * Print out the dll and function name
702: */
703:
704: szDisplay = pCur->strModule() + " : " + pCur->strFunction();
705:
706: dc.TextOut(x, y, szDisplay);
707:
708: }
709:
710: dc.MoveTo(0, 2*m_cyChar-1); dc.LineTo(m_cxClient, 2*m_cyChar-1);
711: dc.MoveTo(0, 2*m_cyChar); dc.LineTo(m_cxClient, 2*m_cyChar);
712:
713: return;
714: } /* CListWndLeft::OnPaint() */
715:
716:
717: void CListWndLeft::ComputeWidths()
718: {
719: int i;
720: CRect rt;
721: CString str;
722: CClientDC cdc( this );
723: CFont cFont;
724: CFont * lpcFont;
725: TEXTMETRIC tm;
726: int maxWidth = 0;
727:
728: cFont.CreateFontIndirect(LogFont());
729: lpcFont = cdc.SelectObject(&cFont);
730: cdc.GetTextMetrics( &tm );
731:
732: m_cxChar = tm.tmAveCharWidth;
733: m_cyChar = tm.tmHeight + tm.tmExternalLeading;
734: m_nVscrollPos = m_nHscrollPos = 0;
735:
736: ListItem * pCur;
737:
738: for (i=0; i<ListHead()->GetCount(); i++) {
739: pCur = ListHead()->GetPosition(i, SortOrder());
740: str = pCur->strModule() + " : " + pCur->strFunction();
741:
742: rt.SetRectEmpty();
743: cdc.DrawText(str, -1, &rt, DT_CALCRECT);
744: maxWidth = max(maxWidth, rt.Width()+10);
745: }
746:
747: m_nHscrollMax = maxWidth;
748: SetScrollRange(SB_HORZ, 0, max(1, m_nHscrollMax - m_cxClient), TRUE);
749:
750: m_nVscrollMax = max(1, (int)(ListHead()->GetCount())-m_cyClient/m_cyChar);
751:
752: cdc.SelectObject(lpcFont);
753: Invalidate(TRUE);
754:
755: return;
756: } /* CListWndLeft::ComputeWidths() */
757:
758: /*********************************************************************/
759:
760: BEGIN_MESSAGE_MAP(CListWndRight, CWnd)
761: ON_WM_CREATE()
762: ON_WM_DESTROY()
763: ON_WM_HSCROLL()
764: ON_WM_MOUSEMOVE()
765: ON_WM_PAINT()
766: ON_WM_SIZE()
767: END_MESSAGE_MAP()
768:
769:
770: void CListWndRight::OnPaint()
771: {
772: CPaintDC dc(this);
773: CBrush b(RGB(255, 255, 255));
774: CFont cFont;
775: CFont * lpcFont;
776:
777: CRect area(0, 0, m_cxClient, m_cyClient);
778:
779: dc.FillRect( area, &b);
780:
781: CRect rt;
782: char rgch[256];
783: int perCent;
784: int perCentPer;
785: int perCentAll;
786: int perCentPerAll;
787: int j;
788: int i;
789: int x = -m_nHscrollPos;
790: int y;
791:
792: int nStart;
793: int nEnd;
794:
795: nStart = max(dc.m_ps.rcPaint.top, 2*m_cyChar);
796: nStart = m_nVscrollPos + (nStart / m_cyChar) - 2;
797:
798: nEnd = min( ListHead()->GetCount(),
799: (dc.m_ps.rcPaint.bottom - dc.m_ps.rcPaint.top) / m_cyChar +
800: nStart + 2);
801:
802: dc.FillRect(&dc.m_ps.rcPaint, &b);
803:
804: area.SetRect(0, 0, m_cxClient, 0);
805: dc.SetBkMode(TRANSPARENT);
806:
807: cFont.CreateFontIndirect(LogFont());
808: lpcFont = dc.SelectObject(&cFont);
809:
810: area.bottom = 2*m_cyChar;
811: dc.FillRect( area, &b );
812: dc.SetTextColor(0);
813:
814: /*
815: * Print out the titles for the List Window
816: */
817:
818: dc.SetTextAlign( TA_CENTER | TA_TOP );
819:
820: rt.SetRect(x, 0, x+rgl[0]-5, 2*m_cyChar);
821: dc.ExtTextOut(x+(rgl[0]-5)/2, 0, ETO_CLIPPED, &rt, "Num", 3, NULL);
822: dc.ExtTextOut(x+(rgl[0]-5)/2, m_cyChar, ETO_CLIPPED, &rt, "Calls", 5, NULL);
823:
824: rt.SetRect(x+rgl[0], 0, x+rgl[4]-5, 2*m_cyChar);
825: dc.ExtTextOut(x+(rgl[0]+rgl[4]-5)/2, 0, ETO_CLIPPED, &rt, "Function Only", 13, NULL);
826:
827: rt.SetRect(x+rgl[0], 0, x+rgl[2]-5, 2*m_cyChar);
828: dc.ExtTextOut(x+(rgl[0]+rgl[2]-5)/2, m_cyChar, ETO_CLIPPED, &rt, "Function", 8, NULL);
829:
830: rt.SetRect(x+rgl[2], 0, x+rgl[4]-5, 2*m_cyChar);
831: dc.ExtTextOut(x+(rgl[2]+rgl[4]-5)/2, m_cyChar, ETO_CLIPPED, &rt, "Per Call", 8, NULL);
832:
833: rt.SetRect(x+rgl[4], 0, x+rgl[6]-5, 2*m_cyChar);
834: dc.ExtTextOut(x+(rgl[4]+rgl[6]-5)/2, m_cyChar, ETO_CLIPPED, &rt, "Function", 8, NULL);
835:
836: rt.SetRect(x+rgl[4], 0, x+rgl[8], 2*m_cyChar);
837: dc.ExtTextOut(x+(rgl[4]+rgl[8])/2, 0, ETO_CLIPPED, &rt, "Function + Children", 19, NULL);
838:
839: rt.SetRect(x+rgl[6], 0, x+rgl[8], 2*m_cyChar);
840: dc.ExtTextOut(x+(rgl[6]+rgl[8])/2, m_cyChar, ETO_CLIPPED, &rt, "Per Call", 8, NULL);
841:
842: dc.SetTextAlign( TA_RIGHT | TA_TOP );
843:
844:
845: /*
846: * Now print out the actual data items
847: */
848:
849: CString szDisplay;
850: ListItem * pCur;
851:
852: for ( y= (nStart - m_nVscrollPos + 2)*m_cyChar;
853: nStart < nEnd;
854: nStart++, y += m_cyChar ) {
855: pCur = ListHead()->GetPosition( nStart, SortOrder() );
856: perCent = (int) pCur->Time().PerCent(ListHead()->TotalTime());
857: perCentPer = (int) pCur->TimePerCall().PerCent(ListHead()->TotalTime());
858: perCentAll = (int) pCur->TimeAll().PerCent(ListHead()->TotalTime());
859: perCentPerAll = (int) pCur->TimeAllPerCall().PerCent(ListHead()->TotalTime());
860:
861: for (j=0; j<RangeStruct()->cRanges-1; j++) {
862: if ((RangeStruct()->Above[j] <= perCent) &&
863: (perCent < RangeStruct()->Above[j+1])) {
864: break;
865: }
866: }
867:
868: CBrush bBack( RangeStruct()->BackColor[j] );
869:
870: dc.SetTextColor( RangeStruct()->TextColor[j] * RGB(255, 255, 255));
871:
872: area.top = y;
873: area.bottom = y + m_cyChar;
874: dc.FillRect( area, &bBack );
875:
876: /*
877: * Now print the number of calls
878: */
879:
880: sprintf(rgch, "%d", pCur->Calls());
881: rt.SetRect(x, y, x+x+rgl[0]-5, y+m_cyChar);
882: dc.ExtTextOut(x+rgl[0]-5, y, ETO_CLIPPED, &rt,
883: rgch, strlen(rgch), NULL);
884:
885: /*
886: *
887: */
888:
889: pCur->Time().format(rgch);
890: rt.SetRect(x+rgl[0], y, x+rgl[1]-5, y+m_cyChar);
891: dc.ExtTextOut(x+rgl[1]-5, y, ETO_CLIPPED, &rt,
892: rgch, strlen(rgch), NULL);
893:
894: sprintf(rgch, "%d%%", perCent);
895: rt.SetRect(x+rgl[1], y, x+rgl[2]-5, y+m_cyChar);
896: dc.ExtTextOut(x+rgl[2]-5, y, ETO_CLIPPED, &rt,
897: rgch, strlen(rgch), NULL);
898:
899: pCur->TimePerCall().format(rgch);
900: rt.SetRect(x+rgl[2], y, x+rgl[3]-5, y+m_cyChar);
901: dc.ExtTextOut(x+rgl[3]-5, y, ETO_CLIPPED, &rt,
902: rgch, strlen(rgch), NULL);
903:
904: sprintf(rgch, "%d%%", perCentPer);
905: rt.SetRect(x+rgl[3], y, x+rgl[4]-5, y+m_cyChar);
906: dc.ExtTextOut(x+rgl[4]-5, y, ETO_CLIPPED, &rt,
907: rgch, strlen(rgch), NULL);
908:
909: pCur->TimeAll().format(rgch);
910: rt.SetRect(x+rgl[4], y, x+rgl[5]-5, y+m_cyChar);
911: dc.ExtTextOut(x+rgl[5]-5, y, ETO_CLIPPED, &rt,
912: rgch, strlen(rgch), NULL);
913:
914: sprintf(rgch, "%d%%", perCentAll);
915: rt.SetRect(x+rgl[5], y, x+rgl[6]-5, y+m_cyChar);
916: dc.ExtTextOut(x+rgl[6]-5, y, ETO_CLIPPED, &rt,
917: rgch, strlen(rgch), NULL);
918:
919: pCur->TimeAllPerCall().format(rgch);
920: rt.SetRect(x+rgl[6], y, x+rgl[7]-5, y+m_cyChar);
921: dc.ExtTextOut(x+rgl[7]-5, y, ETO_CLIPPED, &rt,
922: rgch, strlen(rgch), NULL);
923:
924: sprintf(rgch, "%d%%", perCentPerAll);
925: rt.SetRect(x+rgl[7], y, x+rgl[8]-5, y+m_cyChar);
926: dc.ExtTextOut(x+rgl[8]-5, y, ETO_CLIPPED, &rt,
927: rgch, strlen(rgch), NULL);
928: }
929:
930: /*
931: * Now lets draw in the funny lines which make things look better
932: */
933:
934: for (i=0; i<8; i++) {
935: if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) {
936: y = 2*m_cyChar;
937: } else if ((i == 2) || (i == 6)) {
938: y = m_cyChar;
939: } else {
940: y = 0;
941: }
942: dc.MoveTo(x+rgl[i]-3, y); dc.LineTo(x+rgl[i]-3, m_cyClient);
943: dc.MoveTo(x+rgl[i]-2, y); dc.LineTo(x+rgl[i]-2, m_cyClient);
944: dc.MoveTo(x+rgl[i]-1, y); dc.LineTo(x+rgl[i]-1, m_cyClient);
945: }
946:
947: dc.MoveTo(x+rgl[0], m_cyChar-1); dc.LineTo(m_cxClient, m_cyChar-1);
948: dc.MoveTo(x+rgl[0], m_cyChar); dc.LineTo(m_cxClient, m_cyChar);
949: dc.MoveTo(x+rgl[0], m_cyChar+1); dc.LineTo(m_cxClient, m_cyChar+1);
950:
951: dc.MoveTo(0, 2*m_cyChar-1); dc.LineTo(m_cxClient, 2*m_cyChar-1);
952: dc.MoveTo(0, 2*m_cyChar); dc.LineTo(m_cxClient, 2*m_cyChar);
953:
954: dc.SelectObject(lpcFont);
955: return;
956: } /* CListWndRight::OnPaint() */
957:
958: void CListWndRight::ComputeWidths()
959: {
960: int i;
961: char rgch[100];
962: CRect rt;
963: CClientDC cdc( this );
964: CFont cFont;
965: CFont * lpcFont;
966: TEXTMETRIC tm;
967:
968: int perCent;
969: int perCentPer;
970: int perCentAll;
971: int perCentPerAll;
972:
973: cFont.CreateFontIndirect(LogFont());
974: lpcFont = cdc.SelectObject(&cFont);
975: cdc.GetTextMetrics( &tm );
976:
977: m_cxChar = tm.tmAveCharWidth;
978: m_cyChar = tm.tmHeight + tm.tmExternalLeading;
979: m_nVscrollPos = m_nHscrollPos = 0;
980:
981: ListItem * pCur;
982: CString szDisplay;
983:
984: for (i=0; i<9; i++) {
985: rgl[i] = 0;
986: }
987:
988:
989: for (i=0; i<ListHead()->GetCount(); i++) {
990: pCur = ListHead()->GetPosition(i, SortOrder());
991:
992: perCent = (int) pCur->Time().PerCent(ListHead()->TotalTime());
993: perCentPer = (int) pCur->TimePerCall().PerCent(ListHead()->TotalTime());
994: perCentAll = (int) pCur->TimeAll().PerCent(ListHead()->TotalTime());
995: perCentPerAll = (int) pCur->TimeAllPerCall().PerCent(ListHead()->TotalTime());
996:
997:
998: /*
999: * Width of # calls
1000: */
1001:
1002: sprintf(rgch, "%d", pCur->Calls());
1003: rt.SetRectEmpty();
1004: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT);
1005: rgl[0] = max(rgl[0], rt.Width()+10);
1006:
1007: /*
1008: *
1009: */
1010:
1011: pCur->Time().format(rgch);
1012: rt.SetRectEmpty();
1013: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT);
1014: rgl[1] = max(rgl[1], rt.Width()+10);
1015:
1016: sprintf(rgch, "%d%%", perCent);
1017: rt.SetRectEmpty();
1018: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT);
1019: rgl[2] = max(rgl[2], rt.Width()+10);
1020:
1021: pCur->TimePerCall().format(rgch);
1022: rt.SetRectEmpty();
1023: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT);
1024: rgl[3] = max(rgl[3], rt.Width()+10);
1025:
1026: sprintf(rgch, "%d%%", perCentPer);
1027: rt.SetRectEmpty();
1028: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT);
1029: rgl[4] = max(rgl[4], rt.Width()+10);
1030:
1031: pCur->TimeAll().format(rgch);
1032: rt.SetRectEmpty();
1033: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT);
1034: rgl[5] = max(rgl[5], rt.Width()+10);
1035:
1036: sprintf(rgch, "%d%%", perCentAll);
1037: rt.SetRectEmpty();
1038: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT);
1039: rgl[6] = max(rgl[6], rt.Width()+10);
1040:
1041: pCur->TimeAllPerCall().format(rgch);
1042: rt.SetRectEmpty();
1043: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT);
1044: rgl[7] = max(rgl[7], rt.Width()+10);
1045:
1046: sprintf(rgch, "%d%%", perCentPerAll);
1047: rt.SetRectEmpty();
1048: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT);
1049: rgl[8] = max(rgl[8], rt.Width()+10);
1050: }
1051:
1052: for (i=1; i<9; i++) {
1053: rgl[i] += rgl[i-1];
1054: }
1055:
1056: m_nHscrollMax = rgl[8];
1057: SetScrollRange(SB_HORZ, 0, max(1, m_nHscrollMax), TRUE);
1058:
1059: m_nVscrollMax = max(1, (int)(ListHead()->GetCount())-m_cyClient/m_cyChar);
1060:
1061: cdc.SelectObject(lpcFont);
1062: Invalidate(TRUE);
1063:
1064: return;
1065: } /* CListWndRight::ComputeWidths() */
1066:
1067:
1068: #if 0
1069: afx_msg void CListWndRight::OnMouseMove(UINT nFlags, CPoint pt)
1070: {
1071: int i;
1072: BOOL f = FALSE;
1073:
1074: // if (!fCapture) {
1075:
1076: SetCursor(HCursorNormal);
1077:
1078: // } else {
1079: // CClientDC dc(this);
1080: // int x = min(max(pt.x, rgl[iCapture-1]+10),
1081: // rgl[iCapture+1]-10);
1082: //
1083: // dc.InvertRect(&rtCapture);
1084: // rtCapture.SetRect(x-1, 0, x+1, m_cyClient);
1085: // dc.InvertRect(&rtCapture);
1086: // }
1087: } /* CListWndRight::OnMouseMove() */
1088:
1089:
1090: afx_msg void CListWnd::OnLButtonDown(UINT nFlags, CPoint pt)
1091: {
1092: BOOL f = FALSE;
1093: int i;
1094:
1095: for (i=1; i<10; i++) {
1096: if ((rgl[i]-5 < pt.x) && (pt.x < rgl[i])) {
1097: f = TRUE;
1098: break;
1099: }
1100: }
1101:
1102: if (f) {
1103: CClientDC dc(this);
1104: fCapture = TRUE;
1105: iCapture = i;
1106: SetCapture();
1107: rtCapture.SetRect(pt.x-1, 0, pt.x+1, m_cyClient);
1108: dc.InvertRect(&rtCapture);
1109: } else {
1110: CWnd::OnLButtonDown(nFlags, pt);
1111: }
1112: } /* CListWnd::OnLButtonDown() */
1113:
1114: afx_msg void CListWnd::OnLButtonUp(UINT nFlags, CPoint pt)
1115: {
1116: if (fCapture) {
1117: ReleaseCapture();
1118: fCapture = FALSE;
1119: rgl[iCapture] = min(max(pt.x, rgl[iCapture-1]+10), rgl[iCapture+1]-10);
1120: Invalidate(TRUE);
1121: } else {
1122: CWnd::OnLButtonUp(nFlags, pt);
1123: }
1124: } /* CListWnd::OnLButtonDown() */
1125: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.