|
|
1.1 root 1: // fileview.cpp : Defines the class behaviors for the application.
2: //
3: // This is a part of the Microsoft Foundation Classes C++ library.
4: // Copyright (C) 1992 Microsoft Corporation
5: // All rights reserved.
6: //
7: // This source code is only intended as a supplement to the
8: // Microsoft Foundation Classes Reference and Microsoft
9: // QuickHelp documentation provided with the library.
10: // See these sources for detailed information regarding the
11: // Microsoft Foundation Classes product.
12:
13: #include "fileview.h"
14:
15: #include "afxdlgs.h"
16:
17: #define SIZESTRING 256 // max characters in string
18:
19: /////////////////////////////////////////////////////////////////////////////
20:
21: // theApp:
22: // Just creating this application object runs the whole application.
23: //
24: CTheApp theApp;
25:
26: /////////////////////////////////////////////////////////////////////////////
27:
28: // CMainWindow constructor:
29: // Create the window with the appropriate style, size, menu, etc.
30: //
31: CMainWindow::CMainWindow()
32: {
33: VERIFY(LoadAccelTable( "MainAccelTable" ));
34: VERIFY(Create( NULL, "FileView Application",
35: WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
36: rectDefault, NULL, "MainMenu" ));
37: }
38:
39: CMainWindow::~CMainWindow()
40: {
41: if (m_pMyFile != NULL)
42: {
43: m_pMyFile->Close();
44: delete m_pMyFile;
45: }
46: }
47: // OnCreate
48: //
49:
50: int CMainWindow::OnCreate( LPCREATESTRUCT /* lpcs */)
51: {
52: TEXTMETRIC tm;
53: CWindowDC dc( this );
54:
55: dc.SelectStockObject( SYSTEM_FIXED_FONT );
56: dc.GetTextMetrics( &tm );
57:
58: m_nCxChar = tm.tmAveCharWidth;
59: m_nCyChar = tm.tmHeight + tm.tmExternalLeading;
60:
61: m_nVScrollPos = 0;
62: m_nHScrollPos = 0;
63: m_lTopLine = 0L;
64: m_pMyFile = NULL;
65:
66: SetScrollRange( SB_VERT, 0, SCROLLMAX, FALSE );
67: SetScrollRange( SB_HORZ, 0, SIZESTRING, FALSE );
68:
69: return 0;
70: }
71:
72:
73: // OnPaint
74: //
75:
76: void CMainWindow::OnPaint()
77: {
78: char acBuf[ SIZESTRING ];
79: CPaintDC dc( this );
80: CRect rect, rect2;
81: int y;
82: char* pc;
83:
84: GetClientRect( &rect );
85: dc.SetTextAlign( TA_LEFT );
86: dc.SelectStockObject( SYSTEM_FIXED_FONT );
87: dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
88: dc.SetBkColor(::GetSysColor(COLOR_WINDOW));
89: if ( m_pMyFile != NULL )
90: {
91: TRY
92: {
93: m_pMyFile->Seek( m_lTopLine, CFile::begin );
94: }
95: CATCH( CFileException, e )
96: {
97: TRACE( "Bad Seek in OnPaint %ld\n", m_lTopLine );
98: }
99: END_CATCH
100:
101: rect2.left = rect.left;
102: rect2.right = rect.right;
103:
104: m_nLinesPainted = 0;
105: for ( y = m_nCxChar/2; y < rect.bottom; y += m_nCyChar )
106: {
107: m_pMyFile->NextLine( acBuf, SIZESTRING );
108:
109: pc = acBuf;
110: if ( (int)strlen(acBuf) < m_nHScrollPos)
111: {
112: *acBuf = 0;
113: }
114: else
115: {
116: pc += m_nHScrollPos;
117: }
118:
119: rect2.top = y;
120: rect2.bottom = y + m_nCyChar;
121: dc.ExtTextOut( m_nCyChar/2, rect2.top, ETO_OPAQUE, &rect2,
122: pc, strlen(pc), NULL );
123: m_nLinesPainted++;
124: }
125: }
126: }
127:
128: // OnAbout:
129: //
130:
131: void CMainWindow::OnAbout()
132: {
133: CModalDialog about( "AboutBox", this );
134: about.DoModal();
135: }
136:
137: // OnExit:
138: //
139:
140: void CMainWindow::OnExit()
141: {
142: DestroyWindow();
143: }
144:
145: // OnOpen:
146: //
147:
148: void CMainWindow::OnOpen()
149: {
150: CString strFileName, strFileTitle;
151:
152: //
153: // First close any open file
154: //
155:
156: if ( m_pMyFile != NULL )
157: {
158: m_pMyFile->Close();
159: delete m_pMyFile;
160: m_pMyFile = NULL;
161: SetWindowText( "No File" );
162: Invalidate( TRUE );
163: m_lTopLine = 0L;
164: m_nVScrollPos = 0;
165: SetScrollPos( SB_VERT, m_nVScrollPos, TRUE );
166: m_nHScrollPos = 0;
167: SetScrollPos( SB_HORZ, m_nHScrollPos, TRUE );
168: }
169:
170: TRY
171: {
172: BOOL bValidFileName = FALSE;
173: BOOL bStringsReleased = FALSE;
174:
175: if (FileDlg(TRUE, SIZESTRING, strFileName.GetBuffer(SIZESTRING),
176: SIZESTRING, strFileTitle.GetBuffer(SIZESTRING)))
177: {
178: strFileName.ReleaseBuffer();
179: strFileTitle.ReleaseBuffer();
180: bStringsReleased = TRUE;
181: bValidFileName = TRUE;
182: }
183:
184: if (!bStringsReleased)
185: {
186: strFileName.ReleaseBuffer();
187: strFileTitle.ReleaseBuffer();
188: }
189:
190: if (bValidFileName)
191: {
192: //
193: // try to open the file here
194: //
195: m_pMyFile = new CLineFile( strFileName,
196: CFile::modeRead | CFile::typeBinary);
197: m_lFileSize = m_pMyFile->GetLength();
198:
199: // check to make sure it is a text file
200: BYTE byBuf[128];
201: for (int iby = m_pMyFile->Read(&byBuf, 128); --iby >= 0;)
202: if (byBuf[iby] > 128)
203: {
204: m_pMyFile->Close();
205: delete m_pMyFile;
206: m_pMyFile = NULL;
207: m_lFileSize = 0L;
208: MessageBox("File contains non-printable characters",
209: "Error", MB_OK);
210: return;
211: }
212: m_pMyFile->SeekToBegin();
213:
214: SetWindowText( strFileTitle );
215: Invalidate(TRUE);
216: }
217: }
218: CATCH( CFileException, e )
219: {
220: char ErrorMsg[ 80 ];
221: sprintf( ErrorMsg,"Opening %s returned a 0x%lx.",
222: (const char*)strFileTitle, e->m_lOsError );
223: MessageBox( ErrorMsg, "File Open Error" );
224: }
225: END_CATCH
226: }
227:
228: //
229: // OnVScroll:
230:
231: void CMainWindow::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* /* pScrollBar */)
232: {
233: char acBuf[SIZESTRING];
234: LONG oldLine = m_lTopLine;
235: LONG l;
236:
237: if ( m_pMyFile == NULL )
238: {
239: return;
240: }
241:
242: TRY
243: {
244: switch ( nSBCode )
245: {
246: case SB_LINEUP:
247: if ( m_lTopLine == 0L )
248: {
249: break;
250: }
251: m_pMyFile->SetBegin( m_lTopLine );
252: m_lTopLine = m_pMyFile->BackLines( acBuf, SIZESTRING, 1 );
253: break;
254:
255: case SB_LINEDOWN:
256: m_pMyFile->Seek( m_lTopLine, CFile::begin);
257: m_lTopLine = m_pMyFile->NextLine( acBuf, SIZESTRING );
258: break;
259:
260: case SB_PAGEUP:
261: if ( m_lTopLine == 0L )
262: {
263: break;
264: }
265: m_pMyFile->SetBegin( m_lTopLine );
266: m_lTopLine = m_pMyFile->BackLines( acBuf, SIZESTRING,
267: m_nLinesPainted );
268: break;
269:
270: case SB_PAGEDOWN:
271: m_lTopLine = m_pMyFile->GetPosition();
272: break;
273:
274: case SB_BOTTOM:
275: nPos = 1000;
276: goto ThumbGoTo;
277:
278: case SB_TOP:
279: nPos = 0;
280: // fall thru
281:
282: case SB_THUMBPOSITION:
283: ThumbGoTo:
284:
285: m_nVScrollPos = nPos;
286: if ( m_lFileSize > 40000L )
287: {
288: l = ( m_lFileSize / 1000L ) * nPos;
289: }
290: else
291: {
292: l = ( m_lFileSize * nPos ) / 1000L;
293: }
294:
295: m_lTopLine = m_pMyFile->LineNear( acBuf, SIZESTRING, l );
296: break;
297:
298: default:
299: return;
300: }
301: }
302: CATCH( CFileException, e )
303: {
304: TRACE( "Bad Seek in OnVScroll\n" );
305: m_lTopLine = 0L;
306: }
307: END_CATCH
308:
309: if ( m_lTopLine < 0L )
310: {
311: m_lTopLine = 0L;
312: }
313:
314: if ( m_lFileSize > 40000 )
315: {
316: m_nVScrollPos = (short)(m_lTopLine / ( m_lFileSize / 1000L ));
317: }
318: else
319: {
320: m_nVScrollPos = (short)(m_lTopLine * 1000L / m_lFileSize);
321: }
322:
323: if ( m_nVScrollPos < 0 )
324: {
325: m_nVScrollPos = 0;
326: }
327: if ( m_nVScrollPos > SCROLLMAX )
328: {
329: m_nVScrollPos = SCROLLMAX;
330: }
331:
332: SetScrollPos( SB_VERT, m_nVScrollPos, TRUE );
333:
334: if ( m_lTopLine != oldLine )
335: {
336: Invalidate( FALSE );
337: }
338: }
339:
340: // OnHScroll:
341: //
342:
343: void
344: CMainWindow::OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* /* pScrollBar */)
345: {
346: if ( m_pMyFile == NULL )
347: {
348: return;
349: }
350:
351: switch ( nSBCode )
352: {
353: case SB_LINEUP:
354: m_nHScrollPos -= 1;
355: break;
356:
357: case SB_LINEDOWN:
358: m_nHScrollPos += 1;
359: break;
360:
361: case SB_PAGEUP:
362: m_nHScrollPos -= 10;
363: break;
364:
365: case SB_PAGEDOWN:
366: m_nHScrollPos += 10;
367: break;
368:
369: case SB_TOP:
370: nPos = 0;
371: // fall thru
372: case SB_THUMBPOSITION:
373: m_nHScrollPos = nPos;
374: break;
375:
376: default:
377: return;
378: }
379:
380: if ( m_nHScrollPos < 0 )
381: {
382: m_nHScrollPos = 0;
383: }
384:
385: if ( m_nHScrollPos > SIZESTRING )
386: {
387: m_nHScrollPos = SIZESTRING;
388: }
389:
390: SetScrollPos( SB_HORZ, m_nHScrollPos, TRUE );
391: Invalidate( FALSE );
392: }
393:
394: //
395: // catch arrow keys and simulate touching scroll bars
396: //
397: void
398: CMainWindow::OnKeyDown( UINT wChar, UINT /* nRepCnt */, UINT /* wFlags */)
399: {
400: switch( wChar )
401: {
402: case VK_HOME:
403: SendMessage( WM_VSCROLL, SB_TOP, 0L);
404: SendMessage( WM_HSCROLL, SB_TOP, 0L);
405: break;
406:
407: case VK_END:
408: SendMessage( WM_VSCROLL, SB_BOTTOM, 0L);
409: break;
410:
411: case VK_PRIOR:
412: SendMessage( WM_VSCROLL, SB_PAGEUP, 0L);
413: break;
414:
415: case VK_NEXT:
416: SendMessage( WM_VSCROLL, SB_PAGEDOWN, 0L);
417: break;
418:
419: case VK_UP:
420: SendMessage( WM_VSCROLL, SB_LINEUP, 0L);
421: break;
422:
423: case VK_DOWN:
424: SendMessage( WM_VSCROLL, SB_LINEDOWN, 0L);
425: break;
426:
427: case VK_RIGHT:
428: SendMessage( WM_HSCROLL, SB_LINEDOWN, 0L);
429: break;
430:
431: case VK_LEFT:
432: SendMessage( WM_HSCROLL, SB_LINEUP, 0L);
433: break;
434: }
435: }
436:
437: BOOL
438: CMainWindow::FileDlg( BOOL bOpen, int nMaxFile, LPSTR szFile,
439: int nMaxFileTitle, LPSTR szFileTitle )
440: {
441: char szFilter[] = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*||";
442: CFileDialog dlg(bOpen, "txt", szFile, OFN_HIDEREADONLY, szFilter);
443:
444: // This example shows how to access the OPENFILENAME struct
445: // directly.
446: dlg.m_ofn.lpstrFile = szFile;
447: dlg.m_ofn.lpstrFileTitle = szFileTitle;
448: dlg.m_ofn.nMaxFileTitle = nMaxFileTitle;
449:
450: return dlg.DoModal() == IDOK ? TRUE : FALSE;
451: }
452:
453: // CMainWindow message map:
454: // Associate messages with member functions.
455: //
456: // It is implied that the ON_WM_PAINT macro expects a member function
457: // "void OnPaint()".
458: //
459: // It is implied that members connected with the ON_COMMAND macro
460: // receive no arguments and are void of return type, e.g., "void OnAbout()".
461: //
462: BEGIN_MESSAGE_MAP( CMainWindow, CFrameWnd )
463: ON_WM_PAINT()
464: ON_COMMAND( IDM_ABOUT, OnAbout )
465: ON_COMMAND( IDM_OPEN, OnOpen )
466: ON_COMMAND( IDM_EXIT, OnExit )
467: ON_WM_HSCROLL()
468: ON_WM_VSCROLL()
469: ON_WM_CREATE()
470: ON_WM_KEYDOWN()
471: END_MESSAGE_MAP()
472:
473: /////////////////////////////////////////////////////////////////////////////
474: // CTheApp
475:
476: // InitInstance:
477: // When any CTheApp object is created, this member function is automatically
478: // called. Any data may be set up at this point.
479: //
480: // Also, the main window of the application should be created and shown here.
481: // Return TRUE if the initialization is successful.
482: //
483: BOOL CTheApp::InitInstance()
484: {
485: m_pMainWnd = new CMainWindow();
486: m_pMainWnd->ShowWindow( m_nCmdShow );
487: m_pMainWnd->UpdateWindow();
488:
489: return TRUE;
490: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.