home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / FILE_LK.ZIP / FILELVW.CPP < prev    next >
C/C++ Source or Header  |  1993-12-18  |  8KB  |  381 lines

  1. // filelvw.cpp : implementation of the CFilelookView class
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "filelook.h"
  6. #include "mainfrm.h"
  7.  
  8. #include "fileldoc.h"
  9. #include "filelvw.h"
  10.  
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char BASED_CODE THIS_FILE[] = __FILE__;
  14. #endif
  15.  
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CFilelookView
  18.  
  19. IMPLEMENT_DYNCREATE(CFilelookView, CView)
  20.  
  21. BEGIN_MESSAGE_MAP(CFilelookView, CView)
  22.     //{{AFX_MSG_MAP(CFilelookView)
  23.     ON_WM_CREATE()
  24.     ON_WM_VSCROLL()
  25.     ON_WM_HSCROLL()
  26.     ON_WM_KEYDOWN()
  27.     ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
  28.     ON_UPDATE_COMMAND_UI(ID_INDICATOR_COLUMN, OnUpdateIndicatorColumn)
  29.     ON_UPDATE_COMMAND_UI(ID_INDICATOR_FILESIZE, OnUpdateIndicatorFilesize)
  30.     ON_UPDATE_COMMAND_UI(ID_INDICATOR_ROW, OnUpdateIndicatorRow)
  31.     //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33.  
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CFilelookView construction/destruction
  36.  
  37. CFilelookView::CFilelookView()
  38. {
  39.     // TODO: add construction code here
  40. }
  41.  
  42. CFilelookView::~CFilelookView()
  43. {
  44. }
  45.  
  46.  
  47. void CFilelookView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
  48. {
  49.   CFilelookDoc* pDoc = GetDocument();
  50.   CLineFile *m_pMyFile=pDoc->m_pMyFile;
  51.   
  52.   CView::OnUpdate(pSender, lHint, pHint);
  53.   
  54.   if(m_pMyFile==NULL){
  55.         m_lTopLine = 0L;
  56.         m_nVScrollPos = 0;
  57.         SetScrollPos( SB_VERT, m_nVScrollPos, TRUE );
  58.         m_nHScrollPos = 0;
  59.         SetScrollPos( SB_HORZ, m_nHScrollPos, TRUE );
  60.   }
  61. }
  62.  
  63.  
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CFilelookView drawing
  66.  
  67. void CFilelookView::OnDraw(CDC* pDC)
  68. {
  69.     CFilelookDoc* pDoc = GetDocument();
  70.     CLineFile *m_pMyFile=pDoc->m_pMyFile;
  71.     CStatusBar *pStatusBar = &(((CMainFrame*)GetParentFrame())->m_wndStatusBar);
  72.  
  73.     // TODO: add draw code here
  74.     char        acBuf[ SIZESTRING ];
  75.     CRect       rect, rect2;
  76.     int         y;
  77.     char*       pc;
  78.  
  79.     GetClientRect( &rect );
  80.     pDC->SetTextAlign( TA_LEFT );
  81.     pDC->SelectStockObject( OEM_FIXED_FONT );
  82.     pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
  83.     pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));
  84.     
  85.     if ( m_pMyFile != NULL ) {
  86.         m_pMyFile->Seek( m_lTopLine, CFile::begin );
  87.  
  88.         rect2.left  = rect.left;
  89.         rect2.right = rect.right;
  90.  
  91.         m_nLinesPainted = 0;
  92.         for ( y = m_nCxChar/2; y < rect.bottom; y += m_nCyChar ){
  93.             m_pMyFile->NextLine( acBuf, SIZESTRING );
  94.  
  95.             pc = acBuf;
  96.             if ( (int)strlen(acBuf) < m_nHScrollPos){
  97.                 *acBuf = 0;
  98.             }
  99.             else{
  100.                 pc += m_nHScrollPos;
  101.             }
  102.  
  103.             rect2.top = y;
  104.             rect2.bottom = y + m_nCyChar;
  105.             pDC->ExtTextOut( m_nCyChar/2, rect2.top, ETO_OPAQUE, &rect2,
  106.                            pc, strlen(pc), NULL );
  107.             m_nLinesPainted++;
  108.         }
  109.     }
  110.     else{
  111.         m_lTopLine = 0L;
  112.         m_nVScrollPos = 0;
  113.         SetScrollPos( SB_VERT, m_nVScrollPos, TRUE );
  114.         m_nHScrollPos = 0;
  115.         SetScrollPos( SB_HORZ, m_nHScrollPos, TRUE );
  116.     }
  117.     char tempBuf[20];
  118.     sprintf(tempBuf,"%6ld",m_lTopLine);
  119.     pStatusBar->SetPaneText(PANE_IDX_ROW,tempBuf,TRUE);
  120.     sprintf(tempBuf,"%4d",m_nHScrollPos);
  121.     pStatusBar->SetPaneText(PANE_IDX_COLUMN,tempBuf,TRUE);
  122.     sprintf(tempBuf,"%8ld",pDoc->m_lFileSize);
  123.     pStatusBar->SetPaneText(PANE_IDX_FILESIZE,tempBuf,TRUE);
  124. }
  125.  
  126.  
  127.  
  128. /////////////////////////////////////////////////////////////////////////////
  129. // CFilelookView diagnostics
  130.  
  131. #ifdef _DEBUG
  132. void CFilelookView::AssertValid() const
  133. {
  134.     CView::AssertValid();
  135. }
  136.  
  137. void CFilelookView::Dump(CDumpContext& dc) const
  138. {
  139.     CView::Dump(dc);
  140. }
  141.  
  142. CFilelookDoc* CFilelookView::GetDocument() 
  143. {
  144.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFilelookDoc)));
  145.     return (CFilelookDoc*) m_pDocument;
  146. }
  147.  
  148. #endif //_DEBUG
  149.  
  150. /////////////////////////////////////////////////////////////////////////////
  151. // CFilelookView message handlers
  152.  
  153.  
  154. int CFilelookView::OnCreate(LPCREATESTRUCT lpCreateStruct)
  155. {
  156.     if (CView::OnCreate(lpCreateStruct) == -1)
  157.         return -1;
  158.     
  159.     TEXTMETRIC tm;
  160.     CWindowDC dc( this );
  161.  
  162.     dc.SelectStockObject( SYSTEM_FIXED_FONT );
  163.     dc.GetTextMetrics( &tm );
  164.  
  165.     m_nCxChar = tm.tmAveCharWidth;
  166.     m_nCyChar = tm.tmHeight + tm.tmExternalLeading;
  167.  
  168.     m_nVScrollPos = 0;
  169.     m_nHScrollPos = 0;
  170.     m_lTopLine = 0L;
  171.  
  172.     SetScrollRange( SB_VERT, 0, SCROLLMAX, FALSE );
  173.     SetScrollRange( SB_HORZ, 0, SIZESTRING, FALSE );
  174.     return 0;
  175. }
  176.  
  177. void CFilelookView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  178. {
  179.     CFilelookDoc* pDoc = GetDocument();
  180.     CLineFile *m_pMyFile=pDoc->m_pMyFile;
  181.     char        acBuf[SIZESTRING];
  182.     LONG m_lFileSize = pDoc->m_lFileSize;
  183.     LONG        oldLine = m_lTopLine;
  184.     LONG        l;
  185.  
  186.     if ( m_pMyFile == NULL )
  187.         return;
  188.  
  189.     switch ( nSBCode ){
  190.         case SB_LINEUP:
  191.             if ( m_lTopLine > 0L ){
  192.                 m_pMyFile->SetBegin( m_lTopLine );
  193.                 m_lTopLine = m_pMyFile->BackLines( acBuf, SIZESTRING, 1 );
  194.             }
  195.             break;
  196.  
  197.         case SB_LINEDOWN:
  198.             m_pMyFile->Seek( m_lTopLine, CFile::begin);
  199.             m_lTopLine = m_pMyFile->NextLine( acBuf, SIZESTRING );
  200.             break;
  201.  
  202.         case SB_PAGEUP:
  203.             if ( m_lTopLine > 0L ){
  204.                 m_pMyFile->SetBegin( m_lTopLine );
  205.                 m_lTopLine = m_pMyFile->BackLines( acBuf, SIZESTRING,
  206.                                                    m_nLinesPainted );
  207.             }
  208.             break;
  209.  
  210.         case SB_PAGEDOWN:
  211.             m_lTopLine = m_pMyFile->GetPosition();
  212.             break;
  213.  
  214.         case SB_BOTTOM:
  215.             nPos = 1000;
  216.             goto ThumbGoTo;
  217.  
  218.         case SB_TOP:
  219.             nPos = 0;
  220.  
  221.         case SB_THUMBPOSITION:
  222.     ThumbGoTo:
  223.  
  224.             m_nVScrollPos = nPos;
  225.             if ( m_lFileSize > 40000L )    {
  226.                 l = ( m_lFileSize / 1000L ) * nPos;
  227.             }
  228.             else{
  229.                 l = ( m_lFileSize * nPos ) / 1000L;
  230.             }
  231.  
  232.             m_lTopLine = m_pMyFile->LineNear( acBuf, SIZESTRING, l );
  233.             break;
  234.  
  235.         default:
  236.             return;
  237.     }
  238.  
  239.     if ( m_lTopLine < 0L ){
  240.         m_lTopLine = 0L;
  241.     }
  242.  
  243.     if ( m_lFileSize > 40000 )    {
  244.         m_nVScrollPos = (short)(m_lTopLine  / ( m_lFileSize / 1000L ));
  245.     }
  246.     else {
  247.         m_nVScrollPos = (short)(m_lTopLine * 1000L / m_lFileSize);
  248.     }
  249.  
  250.     if ( m_nVScrollPos < 0 ){
  251.         m_nVScrollPos = 0;
  252.     }
  253.     if ( m_nVScrollPos > SCROLLMAX ){
  254.         m_nVScrollPos = SCROLLMAX;
  255.     }
  256.  
  257.     SetScrollPos( SB_VERT, m_nVScrollPos, TRUE );
  258.  
  259.     if ( m_lTopLine != oldLine ){
  260.         Invalidate( FALSE );
  261.     }
  262.  
  263.     CView::OnVScroll(nSBCode, nPos, pScrollBar);
  264. }
  265.  
  266.  
  267. void CFilelookView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  268. {
  269.     CFilelookDoc* pDoc = GetDocument();
  270.     CLineFile *m_pMyFile=pDoc->m_pMyFile;
  271.  
  272.     if ( m_pMyFile == NULL ){
  273.         return;
  274.     }
  275.  
  276.     switch ( nSBCode ){
  277.     case SB_LINEUP:
  278.         m_nHScrollPos -= 1;
  279.         break;
  280.  
  281.     case SB_LINEDOWN:
  282.         m_nHScrollPos += 1;
  283.         break;
  284.  
  285.     case SB_PAGEUP:
  286.         m_nHScrollPos -= 10;
  287.         break;
  288.  
  289.     case SB_PAGEDOWN:
  290.         m_nHScrollPos += 10;
  291.         break;
  292.  
  293.     case SB_TOP:
  294.         nPos = 0;
  295.     case SB_THUMBPOSITION:
  296.         m_nHScrollPos = nPos;
  297.         break;
  298.  
  299.     default:
  300.         return;
  301.     }
  302.  
  303.     if ( m_nHScrollPos < 0 ){
  304.         m_nHScrollPos = 0;
  305.     }
  306.  
  307.     if ( m_nHScrollPos > SIZESTRING ){
  308.         m_nHScrollPos = SIZESTRING;
  309.     }
  310.  
  311.     SetScrollPos( SB_HORZ, m_nHScrollPos, TRUE );
  312.     Invalidate( FALSE );
  313.     
  314.     CView::OnHScroll(nSBCode, nPos, pScrollBar);
  315. }
  316.  
  317. void CFilelookView::OnKeyDown( UINT wChar, UINT  nRepCnt , UINT  wFlags )
  318. {
  319.     switch( wChar )    {
  320.     case VK_HOME:
  321.         SendMessage( WM_VSCROLL, SB_TOP, 0L);
  322.         SendMessage( WM_HSCROLL, SB_TOP, 0L);
  323.         break;
  324.  
  325.     case VK_END:
  326.         SendMessage( WM_VSCROLL, SB_BOTTOM, 0L);
  327.         break;
  328.  
  329.     case VK_PRIOR:
  330.         SendMessage( WM_VSCROLL, SB_PAGEUP, 0L);
  331.         break;
  332.  
  333.     case VK_NEXT:
  334.         SendMessage( WM_VSCROLL, SB_PAGEDOWN, 0L);
  335.         break;
  336.  
  337.     case VK_UP:
  338.         SendMessage( WM_VSCROLL, SB_LINEUP, 0L);
  339.         break;
  340.  
  341.     case VK_DOWN:
  342.         SendMessage( WM_VSCROLL, SB_LINEDOWN, 0L);
  343.         break;
  344.  
  345.     case VK_RIGHT:
  346.         SendMessage( WM_HSCROLL, SB_LINEDOWN, 0L);
  347.         break;
  348.  
  349.     case VK_LEFT:
  350.         SendMessage( WM_HSCROLL, SB_LINEUP, 0L);
  351.         break;
  352.     }
  353.     
  354. }
  355.  
  356. void CFilelookView::OnFileClose()
  357. {
  358.     GetDocument()->DeleteContents();
  359.     Invalidate(TRUE);
  360.     
  361. }
  362.  
  363.  
  364. void CFilelookView::OnUpdateIndicatorColumn(CCmdUI* pCmdUI)
  365. {
  366.     pCmdUI->Enable(TRUE);
  367.     
  368. }
  369.  
  370. void CFilelookView::OnUpdateIndicatorFilesize(CCmdUI* pCmdUI)
  371. {
  372.     pCmdUI->Enable(TRUE);
  373.     
  374. }
  375.  
  376. void CFilelookView::OnUpdateIndicatorRow(CCmdUI* pCmdUI)
  377. {
  378.     pCmdUI->Enable(TRUE);
  379.     
  380. }
  381.