|
|
1.1 root 1: // mpfile.cpp : Defines the child's file code 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 "multipad.h"
14:
15: #include <commdlg.h>
16:
17: #pragma code_seg("_MPFILE")
18:
19: static char BASED_CODE szFileDialogFilter[] =
20: "Text Files (*.txt)|*.txt|All Files (*.*)|*.*||";
21: static char BASED_CODE szFileDialogExt[] = "txt";
22:
23: extern void AddFileToMRU(const char* szFileName);
24:
25: /////////////////////////////////////////////////////////////////////////////
26:
27: // AlreadyOpen:
28: // Just looks through the children for a child with the same filename.
29: // Strange path equivalents can confuse this simple approach, but these
30: // are rare.
31: //
32: CMPChild* CMPFrame::AlreadyOpen(char* szFile)
33: {
34: CWnd* pwndCheck;
35: char szChild[64];
36:
37: // Check each MDI child window in Multipad.
38: //
39: for (pwndCheck = CWnd::FromHandle(::GetWindow(m_hWndMDIClient, GW_CHILD));
40: pwndCheck != NULL; pwndCheck = pwndCheck->GetNextWindow())
41: {
42: // Skip icon title windows.
43: //
44: if (pwndCheck->GetWindow(GW_OWNER) != NULL)
45: continue;
46:
47: // Get current child window's name
48: //
49: pwndCheck->GetWindowText(szChild, sizeof (szChild));
50:
51: if (lstrcmp(szChild, szFile) == 0)
52: return (CMPChild*)pwndCheck;
53: }
54:
55: // No match found -- file is not open.
56: //
57: return NULL;
58: }
59:
60: // CMPChild constructor:
61: // Opens the given file, reads the text into a buffer, and ties the buffer
62: // to a CEdit inside the child.
63: //
64: CMPChild::CMPChild(char* szName)
65: {
66: static int cUntitled = 0;
67: char sz[160];
68:
69: if (!szName)
70: {
71: char* pch = sz + ::LoadString(AfxGetResourceHandle(), IDS_UNTITLED,
72: sz, sizeof(sz));
73: sprintf(pch, "%d", ++cUntitled);
74: }
75: else
76: {
77: strcpy(sz, szName);
78: }
79:
80: if (CMPFrame::GetActiveChild() == NULL)
81: Create(NULL, sz, WS_MAXIMIZE);
82: else
83: Create(NULL, sz, 0L);
84:
85: if (szName != NULL)
86: {
87: if (!LoadFile(szName))
88: {
89: DestroyWindow();
90: }
91: }
92: }
93:
94: // LoadFile:
95: // Reads one file to replace the current buffer's text.
96: //
97: int CMPChild::LoadFile(char* pName)
98: {
99: UINT nLength;
100: HANDLE hTextWnd;
101: LPSTR lpBuffer;
102: CFile file;
103:
104: // The file has a title, so reset the UNTITLED flag.
105: //
106: m_bUntitled = FALSE;
107:
108: if (!file.Open(pName, CFile::modeRead))
109: goto error;
110:
111: nLength = (UINT) file.GetLength();
112:
113: // Attempt to reallocate the edit control's buffer to the file size.
114: //
115: hTextWnd = m_edit.GetHandle();
116: if (LocalReAlloc(hTextWnd, nLength + 1, LHND) == NULL)
117: {
118: // Couldn't reallocate to new size -- error!
119: //
120: file.Close();
121:
122: TRACE("FILE TOO BIG %ld %s\n", file.GetLength(), pName);
123: MPError(MB_OK | MB_ICONHAND, IDS_FILETOOBIG, (LPCSTR)pName);
124: return FALSE;
125: }
126:
127: // Read the file into the buffer.
128: // If that fails, tell the user.
129: //
130: TRY
131: {
132: file.Read((lpBuffer = (LPSTR)LocalLock (hTextWnd)), nLength);
133: }
134: CATCH(CFileException, e)
135: {
136: MPError(MB_OK | MB_ICONHAND, IDS_CANTREAD, (LPCSTR)pName);
137: }
138: END_CATCH
139:
140: // Zero-terminate the edit buffer.
141: //
142: lpBuffer[nLength] = 0;
143: LocalUnlock(hTextWnd);
144:
145: m_edit.SetHandle(hTextWnd);
146: file.Close();
147:
148: AddFileToMRU(pName);
149:
150: return TRUE;
151:
152: error:
153: // Report the error and quit.
154: //
155: MPError(MB_OK | MB_ICONHAND, IDS_CANTOPEN, (LPCSTR)pName);
156: return FALSE;
157: }
158:
159: // ReadFile:
160: // Gets a filename from the user, then creates a new CMPChild for that file.
161: //
162: void CMPFrame::ReadFile()
163: {
164: CFileDialog fileDialog(TRUE, szFileDialogExt, NULL,
165: OFN_HIDEREADONLY, szFileDialogFilter);
166:
167: if (fileDialog.DoModal() == IDOK)
168: ReadFile(fileDialog.GetPathName());
169: }
170:
171: void CMPFrame::ReadFile(const char* szFile)
172: {
173: CWnd* pwndFile;
174: CFileStatus fileStatus;
175:
176: // Get full path to file.
177: //
178: if (CFile::GetStatus(szFile, fileStatus))
179: {
180: // Is file already open?
181: // If so, just bring the file's window to the top.
182: //
183: if ((pwndFile = AlreadyOpen(fileStatus.m_szFullName)) != NULL)
184: {
185: pwndFile->BringWindowToTop();
186: return;
187: }
188: }
189:
190: // Make a new window and load file into it.
191: //
192: new CMPChild(fileStatus.m_szFullName);
193: }
194:
195: // SaveFile:
196: // Writes the text into its file.
197: //
198: void CMPChild::SaveFile()
199: {
200: HANDLE hTextWnd;
201: LPSTR lpExt;
202: char szFile[128];
203: UINT cch;
204: CFile file;
205:
206: GetWindowText(szFile, sizeof(szFile));
207: for (lpExt = szFile; *lpExt; lpExt++)
208: {
209: switch (*lpExt)
210: {
211: case '.':
212: cch = TRUE;
213: break;
214:
215: case '\\':
216: case ':' :
217: cch = FALSE;
218: break;
219: }
220: }
221:
222: if (!cch)
223: {
224: ::LoadString(AfxGetResourceHandle(), IDS_ADDEXT, lpExt,
225: lpExt - (LPSTR)szFile);
226: }
227:
228:
229: if (!file.Open(szFile, CFile::modeCreate | CFile::modeWrite))
230: {
231: MPError (MB_OK | MB_ICONHAND, IDS_CANTCREATE, (LPCSTR)szFile);
232: return;
233: }
234:
235: // Find out the length of the text in the edit control
236: cch = m_edit.GetWindowTextLength();
237:
238: // Obtain a handle to the text buffer
239: hTextWnd = m_edit.GetHandle();
240: lpExt = (LPSTR)LocalLock (hTextWnd);
241:
242: // Write out the contents of the buffer to the file.
243: TRY
244: {
245: file.Write(lpExt, cch);
246: file.Close();
247: }
248: CATCH(CFileException, e)
249: {
250: file.Close();
251: MPError(MB_OK | MB_ICONHAND, IDS_CANTWRITE, (LPCSTR)szFile);
252: }
253: END_CATCH
254:
255: // Clean up
256: LocalUnlock(hTextWnd);
257: m_edit.SetHandle(hTextWnd);
258:
259: m_bChanged = FALSE;
260: }
261:
262: BOOL CMPChild::ChangeFile()
263: {
264: char szTitle[_MAX_PATH];
265: GetWindowText((LPSTR)szTitle, sizeof(szTitle));
266: ::GetFileTitle((LPSTR)szTitle, (LPSTR)szTitle, sizeof(szTitle));
267:
268: CFileDialog fileDialog(FALSE, szFileDialogExt, szTitle,
269: OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFileDialogFilter);
270:
271: if (fileDialog.DoModal() == IDOK)
272: {
273: CString s = fileDialog.GetPathName();
274: AddFileToMRU(s);
275: SetWindowText(s);
276: m_bUntitled = FALSE;
277: return TRUE;
278: }
279: else
280: return FALSE;
281: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.