*/
#define UNICODE
+#define _UNICODE
+
+#define _CRT_SECURE_NO_DEPRECATE
#include <assert.h>
#include <stdio.h>
#include <windows.h>
#include <commdlg.h>
+#include <tchar.h>
#include "main.h"
#include "license.h"
wsprintf(szMessage, szResource, szFileName);
/* Load szCaption */
- LoadString(Globals.hInstance, STRING_ERROR, szResource, SIZEOF(szResource));
+ LoadString(Globals.hInstance, STRING_NOTEPAD, szResource, SIZEOF(szResource));
/* Display Modal Dialog */
MessageBox(Globals.hMainWnd, szMessage, szResource, MB_ICONEXCLAMATION);
wsprintf(szMessage, szResource, szFileName[0] ? szFileName : szUntitled);
/* Load Caption */
- LoadString(Globals.hInstance, STRING_ERROR, szResource, SIZEOF(szResource));
+ LoadString(Globals.hInstance, STRING_NOTEPAD, szResource, SIZEOF(szResource));
/* Display modal */
return MessageBox(Globals.hMainWnd, szMessage, szResource, MB_ICONEXCLAMATION|MB_YESNOCANCEL);
}
+BOOL HasFileExtension(LPCWSTR szFilename)
+{
+ LPCWSTR s;
+
+ s = wcsrchr(szFilename, '\\');
+ if (s)
+ szFilename = s;
+ return wcsrchr(szFilename, '.') != NULL;
+}
+
+
static VOID DoSaveFile(VOID)
{
HANDLE hFile;
- DWORD dwNumWrite;
LPWSTR pTemp;
- LPVOID pConverted = NULL;
DWORD size;
- BYTE bom[3];
- int iBomSize = 0;
- int iCodePage = -1;
- int iNewSize;
- int i;
hFile = CreateFile(Globals.szFileName, GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
}
size = GetWindowTextW(Globals.hEdit, pTemp, size);
- switch(Globals.iEncoding)
- {
- case ENCODING_ANSI:
- iCodePage = CP_ACP;
- break;
-
- case ENCODING_UNICODE:
- pConverted = pTemp;
- iBomSize = 2;
- bom[0] = 0xFF;
- bom[1] = 0xFE;
- break;
-
- case ENCODING_UNICODE_BE:
- pConverted = pTemp;
- iBomSize = 2;
- bom[0] = 0xFE;
- bom[1] = 0xFF;
-
- /* flip the endianness */
- for (i = 0; i < size; i++)
- {
- pTemp[i] = ((pTemp[i] & 0x00FF) << 8)
- | ((pTemp[i] & 0xFF00) >> 8);
- }
- break;
-
- case ENCODING_UTF8:
- iCodePage = CP_UTF8;
- iBomSize = 3;
- bom[0] = 0xEF;
- bom[1] = 0xBB;
- bom[2] = 0xBF;
- break;
- }
-
- if (iCodePage >= 0)
- {
- iNewSize = WideCharToMultiByte(iCodePage, 0, pTemp, size, NULL, 0, NULL, NULL);
- pConverted = HeapAlloc(GetProcessHeap(), 0, iNewSize);
- if (!pConverted)
- {
- HeapFree(GetProcessHeap(), 0, pTemp);
- CloseHandle(hFile);
- ShowLastError();
- return;
- }
- WideCharToMultiByte(iCodePage, 0, pTemp, size, pConverted, iNewSize, NULL, NULL);
- }
- else
- {
- iNewSize = size * sizeof(WCHAR);
- }
-
- if ((iBomSize > 0) && !WriteFile(hFile, bom, iBomSize, &dwNumWrite, NULL))
- ShowLastError();
- else if (!WriteFile(hFile, pConverted, iNewSize, &dwNumWrite, NULL))
+ if (!WriteText(hFile, pTemp, size, Globals.iEncoding, Globals.iEoln))
ShowLastError();
else
SendMessage(Globals.hEdit, EM_SETMODIFY, FALSE, 0);
CloseHandle(hFile);
HeapFree(GetProcessHeap(), 0, pTemp);
-
- if (iCodePage >= 0)
- HeapFree(GetProcessHeap(), 0, pConverted);
}
/**
{
static const WCHAR dotlog[] = { '.','L','O','G',0 };
HANDLE hFile;
- LPSTR pTemp;
- LPWSTR pTemp2 = NULL;
- DWORD size;
- DWORD dwNumRead;
+ LPWSTR pszText;
+ DWORD dwTextLen;
WCHAR log[5];
- LPWSTR p;
- LPBYTE p2;
- int iCodePage;
- int iNewSize;
/* Close any files and prompt to save changes */
if (!DoCloseFile())
hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if(hFile == INVALID_HANDLE_VALUE)
- {
- ShowLastError();
- return;
- }
-
- size = GetFileSize(hFile, NULL);
- if (size == INVALID_FILE_SIZE)
+ if (hFile == INVALID_HANDLE_VALUE)
{
- CloseHandle(hFile);
ShowLastError();
- return;
- }
-
- pTemp = HeapAlloc(GetProcessHeap(), 0, size + sizeof(WCHAR));
- if (!pTemp)
- {
- CloseHandle(hFile);
- ShowLastError();
- return;
+ goto done;
}
- if (!ReadFile(hFile, pTemp, size, &dwNumRead, NULL))
+ if (!ReadText(hFile, &pszText, &dwTextLen, &Globals.iEncoding, &Globals.iEoln))
{
- CloseHandle(hFile);
- HeapFree(GetProcessHeap(), 0, pTemp);
ShowLastError();
- return;
+ goto done;
}
- CloseHandle(hFile);
- pTemp[dwNumRead] = 0;
-
- if (IsTextUnicode(pTemp, dwNumRead, NULL))
- {
- p = (LPWSTR)pTemp;
- p[dwNumRead / 2] = 0;
-
- /* We need to strip BOM Unicode character, SetWindowTextW won't do it for us. */
- if (*p == 0xFEFF)
- {
- Globals.iEncoding = ENCODING_UNICODE_BE;
- p++;
- }
- else if (*p == 0xFFFE)
- {
- Globals.iEncoding = ENCODING_UNICODE;
- p++;
- }
- }
- else
- {
- p2 = (LPBYTE)pTemp;
- if ((p2[0] == 0xEF) && (p2[1] == 0xBB) && (p2[2] == 0xBF))
- {
- iCodePage = CP_UTF8;
- Globals.iEncoding = ENCODING_UTF8;
- p2 += 3;
- dwNumRead -= 3;
- }
- else
- {
- iCodePage = CP_ACP;
- Globals.iEncoding = ENCODING_ANSI;
- }
-
- iNewSize = MultiByteToWideChar(iCodePage, 0, (LPCSTR)p2, dwNumRead, NULL, 0);
- pTemp2 = HeapAlloc(GetProcessHeap(), 0, (iNewSize + 1) * sizeof(*pTemp2));
- if (!pTemp2)
- {
- CloseHandle(hFile);
- HeapFree(GetProcessHeap(), 0, pTemp);
- ShowLastError();
- return;
- }
- MultiByteToWideChar(iCodePage, 0, (LPCSTR)p2, dwNumRead, pTemp2, iNewSize);
- pTemp2[iNewSize] = 0;
- p = pTemp2;
- }
- SetWindowTextW(Globals.hEdit, p);
-
- HeapFree(GetProcessHeap(), 0, pTemp);
- if (pTemp2)
- HeapFree(GetProcessHeap(), 0, pTemp2);
+ SetWindowTextW(Globals.hEdit, pszText);
SendMessage(Globals.hEdit, EM_SETMODIFY, FALSE, 0);
SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0);
SetFileName(szFileName);
UpdateWindowCaption();
+
+done:
+ if (hFile != INVALID_HANDLE_VALUE)
+ CloseHandle(hFile);
+ if (pszText)
+ HeapFree(GetProcessHeap(), 0, pszText);
}
VOID DIALOG_FileNew(VOID)
{
static const WCHAR empty_strW[] = { 0 };
- /* Close any files and promt to save changes */
+ /* Close any files and prompt to save changes */
if (DoCloseFile()) {
SetWindowText(Globals.hEdit, empty_strW);
SendMessage(Globals.hEdit, EM_EMPTYUNDOBUFFER, 0, 0);
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
SendMessage(hCombo, CB_SETCURSEL, Globals.iEncoding, 0);
+
+ hCombo = GetDlgItem(hDlg, ID_EOLN);
+
+ LoadString(Globals.hInstance, STRING_CRLF, szText, SIZEOF(szText));
+ SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
+
+ LoadString(Globals.hInstance, STRING_LF, szText, SIZEOF(szText));
+ SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
+
+ LoadString(Globals.hInstance, STRING_CR, szText, SIZEOF(szText));
+ SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
+
+ SendMessage(hCombo, CB_SETCURSEL, Globals.iEoln, 0);
break;
case WM_NOTIFY:
if (((NMHDR *) lParam)->code == CDN_FILEOK)
{
pNotify = (OFNOTIFY *) lParam;
+
hCombo = GetDlgItem(hDlg, ID_ENCODING);
- Globals.iEncoding = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+ if (hCombo)
+ Globals.iEncoding = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+
+ hCombo = GetDlgItem(hDlg, ID_EOLN);
+ if (hCombo)
+ Globals.iEoln = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
}
break;
}
VOID DIALOG_EditWrap(VOID)
{
static const WCHAR editW[] = { 'e','d','i','t',0 };
- DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL |
- ES_AUTOVSCROLL | ES_MULTILINE;
+ DWORD dwStyle;
RECT rc;
DWORD size;
LPWSTR pTemp;
+ Globals.bWrapLongLines = !Globals.bWrapLongLines;
+
size = GetWindowTextLength(Globals.hEdit) + 1;
pTemp = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
if (!pTemp)
GetWindowText(Globals.hEdit, pTemp, size);
DestroyWindow(Globals.hEdit);
GetClientRect(Globals.hMainWnd, &rc);
- if( Globals.bWrapLongLines ) dwStyle |= WS_HSCROLL | ES_AUTOHSCROLL;
+ dwStyle = Globals.bWrapLongLines ? EDIT_STYLE_WRAP : EDIT_STYLE;
Globals.hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, editW, NULL, dwStyle,
0, 0, rc.right, rc.bottom, Globals.hMainWnd,
NULL, Globals.hInstance, NULL);
SendMessage(Globals.hEdit, WM_SETFONT, (WPARAM)Globals.hFont, (LPARAM)FALSE);
+ SendMessage(Globals.hEdit, EM_LIMITTEXT, 0, 0);
SetWindowTextW(Globals.hEdit, pTemp);
SetFocus(Globals.hEdit);
HeapFree(GetProcessHeap(), 0, pTemp);
-
- Globals.bWrapLongLines = !Globals.bWrapLongLines;
- CheckMenuItem(GetMenu(Globals.hMainWnd), CMD_WRAP,
- MF_BYCOMMAND | (Globals.bWrapLongLines ? MF_CHECKED : MF_UNCHECKED));
}
VOID DIALOG_SelectFont(VOID)
}
}
-VOID DIALOG_Search(VOID)
+typedef HWND (STDCALL *FINDPROC)(LPFINDREPLACE lpfr);
+
+static VOID DIALOG_SearchDialog(FINDPROC pfnProc)
{
- ZeroMemory(&Globals.find, sizeof(Globals.find));
- Globals.find.lStructSize = sizeof(Globals.find);
- Globals.find.hwndOwner = Globals.hMainWnd;
- Globals.find.hInstance = Globals.hInstance;
- Globals.find.lpstrFindWhat = Globals.szFindText;
- Globals.find.wFindWhatLen = SIZEOF(Globals.szFindText);
- Globals.find.Flags = FR_DOWN;
+ ZeroMemory(&Globals.find, sizeof(Globals.find));
+ Globals.find.lStructSize = sizeof(Globals.find);
+ Globals.find.hwndOwner = Globals.hMainWnd;
+ Globals.find.hInstance = Globals.hInstance;
+ Globals.find.lpstrFindWhat = Globals.szFindText;
+ Globals.find.wFindWhatLen = SIZEOF(Globals.szFindText);
+ Globals.find.lpstrReplaceWith = Globals.szReplaceText;
+ Globals.find.wReplaceWithLen = SIZEOF(Globals.szReplaceText);
+ Globals.find.Flags = FR_DOWN;
- /* We only need to create the modal FindReplace dialog which will */
- /* notify us of incoming events using hMainWnd Window Messages */
+ /* We only need to create the modal FindReplace dialog which will */
+ /* notify us of incoming events using hMainWnd Window Messages */
- Globals.hFindReplaceDlg = FindText(&Globals.find);
- assert(Globals.hFindReplaceDlg !=0);
+ Globals.hFindReplaceDlg = pfnProc(&Globals.find);
+ assert(Globals.hFindReplaceDlg !=0);
+}
+
+VOID DIALOG_Search(VOID)
+{
+ DIALOG_SearchDialog(FindText);
}
VOID DIALOG_SearchNext(VOID)
DIALOG_Search();
}
+VOID DIALOG_Replace(VOID)
+{
+ DIALOG_SearchDialog(ReplaceText);
+}
+
+static INT_PTR CALLBACK DIALOG_GoTo_DialogProc(HWND hwndDialog, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ BOOL bResult = FALSE;
+ HWND hTextBox;
+ TCHAR szText[32];
+
+ switch(uMsg) {
+ case WM_INITDIALOG:
+ hTextBox = GetDlgItem(hwndDialog, ID_LINENUMBER);
+ _sntprintf(szText, sizeof(szText) / sizeof(szText[0]), _T("%d"), lParam);
+ SetWindowText(hTextBox, szText);
+ break;
+ case WM_COMMAND:
+ if (HIWORD(wParam) == BN_CLICKED)
+ {
+ if (LOWORD(wParam) == IDOK)
+ {
+ hTextBox = GetDlgItem(hwndDialog, ID_LINENUMBER);
+ GetWindowText(hTextBox, szText, sizeof(szText) / sizeof(szText[0]));
+ EndDialog(hwndDialog, _ttoi(szText));
+ bResult = TRUE;
+ }
+ else if (LOWORD(wParam) == IDCANCEL)
+ {
+ EndDialog(hwndDialog, 0);
+ bResult = TRUE;
+ }
+ }
+ break;
+ }
+
+ return bResult;
+}
+
+VOID DIALOG_GoTo(VOID)
+{
+ INT_PTR nLine;
+ LPTSTR pszText;
+ int nLength, i;
+ DWORD dwStart, dwEnd;
+
+ nLength = GetWindowTextLength(Globals.hEdit);
+ pszText = (LPTSTR) HeapAlloc(GetProcessHeap(), 0, (nLength + 1) * sizeof(*pszText));
+ if (!pszText)
+ return;
+
+ /* Retrieve current text */
+ GetWindowText(Globals.hEdit, pszText, nLength + 1);
+ SendMessage(Globals.hEdit, EM_GETSEL, (WPARAM) &dwStart, (LPARAM) &dwEnd);
+
+ nLine = 1;
+ for (i = 0; pszText[i] && (i < dwStart); i++)
+ {
+ if (pszText[i] == '\n')
+ nLine++;
+ }
+
+ nLine = DialogBoxParam(Globals.hInstance, MAKEINTRESOURCE(DIALOG_GOTO),
+ Globals.hMainWnd, DIALOG_GoTo_DialogProc, nLine);
+
+ if (nLine >= 1)
+ {
+ for (i = 0; pszText[i] && (nLine > 1) && (i < nLength - 1); i++)
+ {
+ if (pszText[i] == '\n')
+ nLine--;
+ }
+ SendMessage(Globals.hEdit, EM_SETSEL, i, i);
+ SendMessage(Globals.hEdit, EM_SCROLLCARET, 0, 0);
+ }
+ HeapFree(GetProcessHeap(), 0, pszText);
+}
+
VOID DIALOG_HelpContents(VOID)
{
WinHelp(Globals.hMainWnd, helpfileW, HELP_INDEX, 0);