VOID DoOpenFile(LPCTSTR szFileName) { static const TCHAR dotlog[] = _T(".LOG"); HANDLE hFile; LPTSTR pszText = NULL; DWORD dwTextLen; TCHAR log[5]; /* Close any files and prompt to save changes */ if (!DoCloseFile()) return; hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { ShowLastError(); goto done; } if (!ReadText(hFile, (LPWSTR *)&pszText, &dwTextLen, &Globals.iEncoding, &Globals.iEoln)) { ShowLastError(); goto done; } #ifndef UNICODE pszText = ConvertToASCII(pszText); if (pszText == NULL) { ShowLastError(); goto done; } #endif SetWindowText(Globals.hEdit, pszText); SendMessage(Globals.hEdit, EM_SETMODIFY, FALSE, 0); SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0); SetFocus(Globals.hEdit); /* If the file starts with .LOG, add a time/date at the end and set cursor after * See http://support.microsoft.com/?kbid=260563 */ if (GetWindowText(Globals.hEdit, log, SIZEOF(log)) && !_tcscmp(log, dotlog)) { static const TCHAR lf[] = _T("\r\n"); SendMessage(Globals.hEdit, EM_SETSEL, GetWindowTextLength(Globals.hEdit), -1); SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)lf); DIALOG_EditTimeDate(); SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)lf); } SetFileName(szFileName); UpdateWindowCaption(); NOTEPAD_EnableSearchMenu(); done: if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); if (pszText) HeapFree(GetProcessHeap(), 0, pszText); }
/*********************************************************************** * * NOTEPAD_MenuCommand * * All handling of main menu events */ static int NOTEPAD_MenuCommand(WPARAM wParam) { switch (wParam) { case CMD_NEW: DIALOG_FileNew(); break; case CMD_OPEN: DIALOG_FileOpen(); break; case CMD_SAVE: DIALOG_FileSave(); break; case CMD_SAVE_AS: DIALOG_FileSaveAs(); break; case CMD_PRINT: DIALOG_FilePrint(); break; case CMD_PAGE_SETUP: DIALOG_FilePageSetup(); break; case CMD_EXIT: DIALOG_FileExit(); break; case CMD_UNDO: DIALOG_EditUndo(); break; case CMD_CUT: DIALOG_EditCut(); break; case CMD_COPY: DIALOG_EditCopy(); break; case CMD_PASTE: DIALOG_EditPaste(); break; case CMD_DELETE: DIALOG_EditDelete(); break; case CMD_SELECT_ALL: DIALOG_EditSelectAll(); break; case CMD_TIME_DATE: DIALOG_EditTimeDate(); break; case CMD_SEARCH: DIALOG_Search(); break; case CMD_SEARCH_NEXT: DIALOG_SearchNext(); break; case CMD_REPLACE: DIALOG_Replace(); break; case CMD_GOTO: DIALOG_GoTo(); break; case CMD_WRAP: DIALOG_EditWrap(); break; case CMD_FONT: DIALOG_SelectFont(); break; case CMD_STATUSBAR: DIALOG_ViewStatusBar(); break; case CMD_HELP_CONTENTS: DIALOG_HelpContents(); break; case CMD_HELP_SEARCH: DIALOG_HelpSearch(); break; case CMD_HELP_ON_HELP: DIALOG_HelpHelp(); break; case CMD_ABOUT: DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_ABOUTBOX), Globals.hMainWnd, AboutDialogProc); break; case CMD_ABOUT_WINE: DIALOG_HelpAboutWine(); break; default: break; } return 0; }
void DoOpenFile(LPCWSTR szFileName, ENCODING enc) { static const WCHAR dotlog[] = { '.','L','O','G',0 }; HANDLE hFile; LPSTR pTemp; DWORD size; DWORD dwNumRead; int lenW; WCHAR* textW; int i; WCHAR log[5]; /* Close any files and prompt to save changes */ if (!DoCloseFile()) return; hFile = CreateFileW(szFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) { AlertFileNotFound(szFileName); return; } size = GetFileSize(hFile, NULL); if (size == INVALID_FILE_SIZE) { CloseHandle(hFile); ShowLastError(); return; } /* Extra memory for (WCHAR)'\0'-termination. */ pTemp = HeapAlloc(GetProcessHeap(), 0, size+2); if (!pTemp) { CloseHandle(hFile); ShowLastError(); return; } if (!ReadFile(hFile, pTemp, size, &dwNumRead, NULL)) { CloseHandle(hFile); HeapFree(GetProcessHeap(), 0, pTemp); ShowLastError(); return; } CloseHandle(hFile); size = dwNumRead; if (enc == ENCODING_AUTO) enc = detect_encoding_of_buffer(pTemp, size); else if (size >= 2 && (enc==ENCODING_UTF16LE || enc==ENCODING_UTF16BE)) { /* If UTF-16 (BE or LE) is selected, and there is a UTF-16 BOM, * override the selection (like native Notepad). */ if ((BYTE)pTemp[0] == 0xff && (BYTE)pTemp[1] == 0xfe) enc = ENCODING_UTF16LE; else if ((BYTE)pTemp[0] == 0xfe && (BYTE)pTemp[1] == 0xff) enc = ENCODING_UTF16BE; } switch (enc) { case ENCODING_UTF16BE: byteswap_wide_string((WCHAR*) pTemp, size/sizeof(WCHAR)); /* Forget whether the file is BE or LE, like native Notepad. */ enc = ENCODING_UTF16LE; /* fall through */ case ENCODING_UTF16LE: textW = (LPWSTR)pTemp; lenW = size/sizeof(WCHAR); break; default: { int cp = (enc==ENCODING_UTF8) ? CP_UTF8 : CP_ACP; lenW = MultiByteToWideChar(cp, 0, pTemp, size, NULL, 0); textW = HeapAlloc(GetProcessHeap(), 0, (lenW+1) * sizeof(WCHAR)); if (!textW) { ShowLastError(); HeapFree(GetProcessHeap(), 0, pTemp); return; } MultiByteToWideChar(cp, 0, pTemp, size, textW, lenW); HeapFree(GetProcessHeap(), 0, pTemp); break; } } /* Replace '\0's with spaces. Other than creating a custom control that * can deal with '\0' characters, it's the best that can be done. */ for (i = 0; i < lenW; i++) if (textW[i] == '\0') textW[i] = ' '; textW[lenW] = '\0'; if (lenW >= 1 && textW[0] == 0xfeff) SetWindowTextW(Globals.hEdit, textW+1); else SetWindowTextW(Globals.hEdit, textW); HeapFree(GetProcessHeap(), 0, textW); SendMessageW(Globals.hEdit, EM_SETMODIFY, FALSE, 0); SendMessageW(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0); SetFocus(Globals.hEdit); /* If the file starts with .LOG, add a time/date at the end and set cursor after */ if (GetWindowTextW(Globals.hEdit, log, ARRAY_SIZE(log)) && !lstrcmpW(log, dotlog)) { static const WCHAR lfW[] = { '\r','\n',0 }; SendMessageW(Globals.hEdit, EM_SETSEL, GetWindowTextLengthW(Globals.hEdit), -1); SendMessageW(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)lfW); DIALOG_EditTimeDate(); SendMessageW(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)lfW); } SetFileNameAndEncoding(szFileName, enc); UpdateWindowCaption(); }
void DoOpenFile(LPCWSTR szFileName) { static const WCHAR dotlog[] = { '.','L','O','G',0 }; HANDLE hFile; LPSTR pTemp; DWORD size; DWORD dwNumRead; WCHAR log[5]; /* Close any files and prompt to save changes */ if (!DoCloseFile()) return; hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile == INVALID_HANDLE_VALUE) { ShowLastError(); return; } size = GetFileSize(hFile, NULL); if (size == INVALID_FILE_SIZE) { CloseHandle(hFile); ShowLastError(); return; } size++; pTemp = HeapAlloc(GetProcessHeap(), 0, size); if (!pTemp) { CloseHandle(hFile); ShowLastError(); return; } if (!ReadFile(hFile, pTemp, size, &dwNumRead, NULL)) { CloseHandle(hFile); HeapFree(GetProcessHeap(), 0, pTemp); ShowLastError(); return; } CloseHandle(hFile); pTemp[dwNumRead] = 0; if (IsTextUnicode(pTemp, dwNumRead, NULL)) { LPWSTR p = (LPWSTR)pTemp; /* We need to strip BOM Unicode character, SetWindowTextW won't do it for us. */ if (*p == 0xFEFF || *p == 0xFFFE) p++; SetWindowTextW(Globals.hEdit, p); } else SetWindowTextA(Globals.hEdit, pTemp); HeapFree(GetProcessHeap(), 0, pTemp); SendMessage(Globals.hEdit, EM_SETMODIFY, FALSE, 0); SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0); SetFocus(Globals.hEdit); /* If the file starts with .LOG, add a time/date at the end and set cursor after * See http://support.microsoft.com/?kbid=260563 */ if (GetWindowTextW(Globals.hEdit, log, sizeof(log)/sizeof(log[0])) && !lstrcmp(log, dotlog)) { static const WCHAR lfW[] = { '\r','\n',0 }; SendMessage(Globals.hEdit, EM_SETSEL, GetWindowTextLength(Globals.hEdit), -1); SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)lfW); DIALOG_EditTimeDate(); SendMessage(Globals.hEdit, EM_REPLACESEL, TRUE, (LPARAM)lfW); } SetFileName(szFileName); UpdateWindowCaption(); }