home *** CD-ROM | disk | FTP | other *** search
/ Using Visual C++ 4 (Special Edition) / Using_Visual_C_4_Special_Edition_QUE_1996.iso / ch05 / filevvw.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-30  |  7.4 KB  |  326 lines

  1. // FileVVw.cpp : implementation of the CFileViewView class
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "FileView.h"
  6.  
  7. #include "FileVDoc.h"
  8. #include "FileVVw.h"
  9.  
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15.  
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CFileViewView
  18.  
  19. IMPLEMENT_DYNCREATE(CFileViewView, CView)
  20.  
  21. BEGIN_MESSAGE_MAP(CFileViewView, CView)
  22.     //{{AFX_MSG_MAP(CFileViewView)
  23.     ON_WM_VSCROLL()
  24.     ON_WM_HSCROLL()
  25.     //}}AFX_MSG_MAP
  26.     // Standard printing commands
  27.     ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  28.     ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  29.     ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  30. END_MESSAGE_MAP()
  31.  
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CFileViewView construction/destruction
  34.  
  35. CFileViewView::CFileViewView()
  36. {
  37.     // TODO: add construction code here
  38.     currentLine = 0;
  39.     margin = 0;
  40. }
  41.  
  42. CFileViewView::~CFileViewView()
  43. {
  44.     delete ourFont;
  45. }
  46.  
  47. BOOL CFileViewView::PreCreateWindow(CREATESTRUCT& cs)
  48. {
  49.     // TODO: Modify the Window class or styles here by modifying
  50.     //  the CREATESTRUCT cs
  51.  
  52.     return CView::PreCreateWindow(cs);
  53. }
  54.  
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CFileViewView drawing
  57.  
  58. void CFileViewView::OnDraw(CDC* pDC)
  59. {
  60.     CFileViewDoc* pDoc = GetDocument();
  61.     ASSERT_VALID(pDoc);
  62.  
  63.     // TODO: add draw code for native data here
  64.     CFont *oldFont;
  65.     CRect clientRect;
  66.  
  67.     oldFont = pDC->SelectObject(ourFont);
  68.  
  69.     CPtrArray *l = pDoc->GetLines();
  70.     int y = 0;
  71.  
  72.     if (pDC->IsPrinting())
  73.         clientRect = printerRect;
  74.     else
  75.         GetClientRect(&clientRect);
  76.  
  77.     for (int i = currentLine; i < l->GetSize(); i++)
  78.     {
  79.         CString *line = (CString *) l->GetAt(i);
  80.         if (line->GetLength() - 2 > margin)
  81.             pDC->TextOut(0, y, line->Mid(margin), line->GetLength() - margin - 2);
  82.         y += lHeight;
  83.         if (y > clientRect.Height())
  84.             break;
  85.     }
  86.     pDC->SelectObject(oldFont);
  87. }
  88.  
  89. /////////////////////////////////////////////////////////////////////////////
  90. // CFileViewView printing
  91.  
  92. BOOL CFileViewView::OnPreparePrinting(CPrintInfo* pInfo)
  93. {
  94.     // default preparation
  95.     return DoPreparePrinting(pInfo);
  96. }
  97.  
  98. void CFileViewView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
  99. {
  100.     CFont *oldFont = pDC->SelectObject(ourFont);
  101.     saveLHeight = lHeight;
  102.     saveCWidth = cWidth;
  103.  
  104.     TEXTMETRIC tm;
  105.     pDC->GetTextMetrics(&tm);
  106.     lHeight = tm.tmHeight + tm.tmExternalLeading;
  107.     cWidth = tm.tmAveCharWidth;
  108.     saveCurrentLine = currentLine;
  109.     currentLine = 0;
  110.     pDC->SelectObject(oldFont);
  111. }
  112.  
  113. void CFileViewView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  114. {
  115.     lHeight = saveLHeight;
  116.     cWidth = saveCWidth;
  117.     currentLine = saveCurrentLine;
  118. }
  119.  
  120. /////////////////////////////////////////////////////////////////////////////
  121. // CFileViewView diagnostics
  122.  
  123. #ifdef _DEBUG
  124. void CFileViewView::AssertValid() const
  125. {
  126.     CView::AssertValid();
  127. }
  128.  
  129. void CFileViewView::Dump(CDumpContext& dc) const
  130. {
  131.     CView::Dump(dc);
  132. }
  133.  
  134. CFileViewDoc* CFileViewView::GetDocument() // non-debug version is inline
  135. {
  136.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFileViewDoc)));
  137.     return (CFileViewDoc*)m_pDocument;
  138. }
  139. #endif //_DEBUG
  140.  
  141. /////////////////////////////////////////////////////////////////////////////
  142. // CFileViewView message handlers
  143.  
  144. void CFileViewView::OnInitialUpdate() 
  145. {
  146.     CFileViewDoc *pDoc = GetDocument();
  147.     CPtrArray *l = pDoc->GetLines();
  148.     SetScrollRange(SB_VERT, 0, l->GetSize());
  149.     SetScrollPos(SB_VERT, 0);
  150.     SetScrollRange(SB_HORZ, 0, pDoc->GetMaxLineLength());
  151.     SetScrollPos(SB_HORZ, 0);
  152.     CDC *pDC = GetDC();
  153.     ourFont = new CFont();
  154.     ourFont->CreateFont(0, 0, 0, 0, FW_NORMAL, FALSE, FALSE,
  155.         FALSE, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_TT_ALWAYS,
  156.         DEFAULT_QUALITY, DEFAULT_PITCH, "Courier New");
  157.     CFont *oldFont = pDC->SelectObject(ourFont);
  158.     
  159.     TEXTMETRIC tm;
  160.     pDC->GetTextMetrics(&tm);
  161.     lHeight = tm.tmHeight + tm.tmExternalLeading;
  162.     cWidth = tm.tmAveCharWidth;
  163.  
  164.     CView::OnInitialUpdate();
  165.     
  166.     // TODO: Add your specialized code here and/or call the base class
  167.     
  168. }
  169.  
  170. void CFileViewView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  171. {
  172.     CFileViewDoc *pDoc = GetDocument();
  173.     CPtrArray *l = pDoc->GetLines();
  174.  
  175.     switch (nSBCode)
  176.     {
  177.     case SB_LINEUP:
  178.         if (currentLine > 0)
  179.             currentLine--;
  180.         break;
  181.  
  182.     case SB_LINEDOWN:
  183.         if (currentLine < l->GetSize())
  184.             currentLine++;
  185.         break;
  186.  
  187.     case SB_BOTTOM:
  188.         currentLine = l->GetSize();
  189.         break;
  190.  
  191.     case SB_TOP:
  192.         currentLine = 0;
  193.         break;
  194.  
  195.     case SB_PAGEUP:
  196.         {
  197.             CRect clientRect;
  198.             GetClientRect(&clientRect);
  199.             currentLine -= (clientRect.Height() / lHeight);
  200.             if (currentLine < 0)
  201.                 currentLine = 0;
  202.         }
  203.         break;
  204.  
  205.     case SB_PAGEDOWN:
  206.         {
  207.             CRect clientRect;
  208.             GetClientRect(&clientRect);
  209.             currentLine += (clientRect.Height() / lHeight);
  210.             if (currentLine > l->GetSize())
  211.                 currentLine = l->GetSize();
  212.         }
  213.         break;
  214.  
  215.     case SB_THUMBPOSITION:
  216.     case SB_THUMBTRACK:
  217.         currentLine = nPos;
  218.         if (currentLine < 0)
  219.             currentLine = 0;
  220.         if (currentLine > l->GetSize())
  221.             currentLine = l->GetSize();
  222.         break;
  223.     }
  224.  
  225.     SetScrollPos(SB_VERT, currentLine);
  226.     Invalidate(TRUE);
  227.  
  228.     CView::OnVScroll(nSBCode, nPos, pScrollBar);
  229. }
  230.  
  231. void CFileViewView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  232. {
  233.     CFileViewDoc *pDoc = GetDocument();
  234.     CPtrArray *l = pDoc->GetLines();
  235.  
  236.     switch (nSBCode)
  237.     {
  238.     case SB_LINELEFT:
  239.         if (margin > 0)
  240.             margin--;
  241.         break;
  242.  
  243.     case SB_LINERIGHT:
  244.         if (margin < pDoc->GetMaxLineLength())
  245.             margin++;
  246.         break;
  247.  
  248.     case SB_RIGHT:
  249.         margin = pDoc->GetMaxLineLength();
  250.         break;
  251.  
  252.     case SB_LEFT:
  253.         margin = 0;
  254.         break;
  255.  
  256.     case SB_PAGELEFT:
  257.         {
  258.             CRect clientRect;
  259.             GetClientRect(&clientRect);
  260.             margin -= (clientRect.Width() / cWidth);
  261.             if (margin < 0)
  262.                 margin = 0;
  263.         }
  264.         break;
  265.  
  266.     case SB_PAGERIGHT:
  267.         {
  268.             CRect clientRect;
  269.             GetClientRect(&clientRect);
  270.             margin += (clientRect.Width() / cWidth);
  271.             if (margin > pDoc->GetMaxLineLength())
  272.                 margin = pDoc->GetMaxLineLength();
  273.         }
  274.         break;
  275.  
  276.     case SB_THUMBPOSITION:
  277.     case SB_THUMBTRACK:
  278.         margin = nPos;
  279.         if (margin < 0)
  280.             margin = 0;
  281.         if (margin > pDoc->GetMaxLineLength())
  282.             margin = pDoc->GetMaxLineLength();
  283.         break;
  284.     }
  285.  
  286.     SetScrollPos(SB_HORZ, margin);
  287.     Invalidate(TRUE);
  288.     
  289.     CView::OnHScroll(nSBCode, nPos, pScrollBar);
  290. }
  291.  
  292. void CFileViewView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
  293. {
  294.     pInfo->m_rectDraw.InflateRect(0, -lHeight);
  295.     printerRect = pInfo->m_rectDraw;
  296.     int linesPerPage = (printerRect.Height() / lHeight) - 1;
  297.     currentLine = linesPerPage * (pInfo->m_nCurPage - 1);
  298.     TRACE2("Printing page %d, starting with line %d\n", pInfo->m_nCurPage, currentLine);
  299.     CView::OnPrint(pDC, pInfo);
  300.     CString footer;
  301.     CFont *oldFont;
  302.     footer.Format("*** File %s ***", GetDocument()->GetPathName());
  303.     oldFont = pDC->SelectObject(ourFont);
  304.     pDC->TextOut(0, pInfo->m_rectDraw.Height() + lHeight, footer);
  305.     pDC->SelectObject(oldFont);
  306. }
  307.  
  308. void CFileViewView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
  309. {
  310.     CView::OnPrepareDC(pDC, pInfo);
  311.  
  312.     if (pInfo != NULL)
  313.     {
  314.         if (currentLine < GetDocument()->GetLines()->GetSize())
  315.         {
  316.             TRACE1("currentLine = %d, continuing printing\n", currentLine);
  317.             pInfo->m_bContinuePrinting = TRUE;
  318.         }
  319.         else
  320.         {
  321.             TRACE1("currentLine = %d, terminating printing\n", currentLine);
  322.             pInfo->m_bContinuePrinting = FALSE;
  323.         }
  324.     }
  325. }
  326.