[NOTEPAD] Printer output improvements by Ricardo Hanke. See CORE-9088 for more details.
[reactos.git] / reactos / base / applications / notepad / dialog.c
index 91f288e..82250ee 100644 (file)
@@ -33,68 +33,7 @@ static const TCHAR empty_str[] = _T("");
 static const TCHAR szDefaultExt[] = _T("txt");
 static const TCHAR txt_files[] = _T("*.txt");
 
-static INT_PTR WINAPI DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
-
-#ifndef UNICODE
-static LPSTR ConvertToASCII(LPSTR pszText)
-{
-    int sz;
-    LPWSTR pszTextW = (LPWSTR)pszText;
-
-    /* default return value */
-    pszText = NULL;
-    do {
-        /* query about requested size for conversion */
-        sz = WideCharToMultiByte(CP_ACP, 0, pszTextW, -1, NULL, 0, NULL, NULL);
-        if (!sz)
-            break;
-
-        /* get space for ASCII buffer */
-        pszText = (LPSTR)HeapAlloc(GetProcessHeap(), 0, sz);
-        if (pszText == NULL)
-            break;
-
-        /* if previous diagnostic call worked fine,
-         * then this one will work too,
-         * so no need to test return value here
-         */
-        WideCharToMultiByte(CP_ACP, 0, pszTextW, -1, pszText, sz, NULL, NULL);
-    } while (0);
-
-    HeapFree(GetProcessHeap(), 0, pszTextW);
-    return pszText;
-}
-
-static LPWSTR ConvertToUNICODE(LPSTR pszText, DWORD *pdwSize)
-{
-    int sz;
-    LPWSTR pszTextW = NULL;
-
-    do {
-        /* query about requested size for conversion */
-        sz = MultiByteToWideChar(CP_ACP, 0, pszText, -1, NULL, 0);
-        if (!sz)
-            break;
-
-        /* get space for UNICODE buffer */
-        pszTextW = HeapAlloc(GetProcessHeap(), 0, sz * sizeof(WCHAR));
-        if (pszText == NULL)
-            break;
-
-        /* if previous diagnostic call worked fine,
-         * then this one will work too,
-         * so no need to test return value here
-         */
-        MultiByteToWideChar(CP_ACP, 0, pszText, -1, pszTextW, sz);
-
-        /* report the new size of the text to the caller */
-        *pdwSize = sz;
-    } while (0);
-
-    HeapFree(GetProcessHeap(), 0, pszText);
-    return pszTextW;
-}
-#endif
+static UINT_PTR CALLBACK DIALOG_PAGESETUP_Hook(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
 
 VOID ShowLastError(VOID)
 {
@@ -104,7 +43,7 @@ VOID ShowLastError(VOID)
         LPTSTR lpMsgBuf = NULL;
         TCHAR szTitle[MAX_STRING_LEN];
 
-        LoadString(Globals.hInstance, STRING_ERROR, szTitle, SIZEOF(szTitle));
+        LoadString(Globals.hInstance, STRING_ERROR, szTitle, ARRAY_SIZE(szTitle));
 
         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                       NULL,
@@ -129,55 +68,68 @@ static void UpdateWindowCaption(void)
     TCHAR szCaption[MAX_STRING_LEN];
     TCHAR szNotepad[MAX_STRING_LEN];
 
-    LoadString(Globals.hInstance, STRING_NOTEPAD, szNotepad, SIZEOF(szNotepad));
+    LoadString(Globals.hInstance, STRING_NOTEPAD, szNotepad, ARRAY_SIZE(szNotepad));
 
     if (Globals.szFileTitle[0] != 0)
     {
-        StringCchCopy(szCaption, SIZEOF(szCaption), Globals.szFileTitle);
+        StringCchCopy(szCaption, ARRAY_SIZE(szCaption), Globals.szFileTitle);
     }
     else
     {
-        LoadString(Globals.hInstance, STRING_UNTITLED, szCaption, SIZEOF(szCaption));
+        LoadString(Globals.hInstance, STRING_UNTITLED, szCaption, ARRAY_SIZE(szCaption));
     }
 
-    StringCchCat(szCaption, SIZEOF(szCaption), _T(" - "));
-    StringCchCat(szCaption, SIZEOF(szCaption), szNotepad);
+    StringCchCat(szCaption, ARRAY_SIZE(szCaption), _T(" - "));
+    StringCchCat(szCaption, ARRAY_SIZE(szCaption), szNotepad);
     SetWindowText(Globals.hMainWnd, szCaption);
 }
 
-static void AlertFileNotFound(LPCTSTR szFileName)
+int DIALOG_StringMsgBox(HWND hParent, int formatId, LPCTSTR szString, DWORD dwFlags)
 {
     TCHAR szMessage[MAX_STRING_LEN];
     TCHAR szResource[MAX_STRING_LEN];
 
     /* Load and format szMessage */
-    LoadString(Globals.hInstance, STRING_NOTFOUND, szResource, SIZEOF(szResource));
-    wsprintf(szMessage, szResource, szFileName);
+    LoadString(Globals.hInstance, formatId, szResource, ARRAY_SIZE(szResource));
+    _sntprintf(szMessage, ARRAY_SIZE(szMessage), szResource, szString);
 
     /* Load szCaption */
-    LoadString(Globals.hInstance, STRING_NOTEPAD, szResource, SIZEOF(szResource));
+    if ((dwFlags & MB_ICONMASK) == MB_ICONEXCLAMATION)
+        LoadString(Globals.hInstance, STRING_ERROR, szResource, ARRAY_SIZE(szResource));
+    else
+        LoadString(Globals.hInstance, STRING_NOTEPAD, szResource, ARRAY_SIZE(szResource));
 
     /* Display Modal Dialog */
-    MessageBox(Globals.hMainWnd, szMessage, szResource, MB_ICONEXCLAMATION);
+    // if (hParent == NULL)
+        // hParent = Globals.hMainWnd;
+    return MessageBox(hParent, szMessage, szResource, dwFlags);
+}
+
+static void AlertFileNotFound(LPCTSTR szFileName)
+{
+    DIALOG_StringMsgBox(Globals.hMainWnd, STRING_NOTFOUND, szFileName, MB_ICONEXCLAMATION | MB_OK);
 }
 
 static int AlertFileNotSaved(LPCTSTR szFileName)
 {
-    TCHAR szMessage[MAX_STRING_LEN];
-    TCHAR szResource[MAX_STRING_LEN];
     TCHAR szUntitled[MAX_STRING_LEN];
 
-    LoadString(Globals.hInstance, STRING_UNTITLED, szUntitled, SIZEOF(szUntitled));
+    LoadString(Globals.hInstance, STRING_UNTITLED, szUntitled, ARRAY_SIZE(szUntitled));
 
-    /* Load and format Message */
-    LoadString(Globals.hInstance, STRING_NOTSAVED, szResource, SIZEOF(szResource));
-    wsprintf(szMessage, szResource, szFileName[0] ? szFileName : szUntitled);
+    return DIALOG_StringMsgBox(Globals.hMainWnd, STRING_NOTSAVED,
+                               szFileName[0] ? szFileName : szUntitled,
+                               MB_ICONQUESTION | MB_YESNOCANCEL);
+}
 
-    /* Load Caption */
-    LoadString(Globals.hInstance, STRING_NOTEPAD, szResource, SIZEOF(szResource));
+static void AlertPrintError(void)
+{
+    TCHAR szUntitled[MAX_STRING_LEN];
+
+    LoadString(Globals.hInstance, STRING_UNTITLED, szUntitled, ARRAY_SIZE(szUntitled));
 
-    /* Display modal */
-    return MessageBox(Globals.hMainWnd, szMessage, szResource, MB_ICONEXCLAMATION|MB_YESNOCANCEL);
+    DIALOG_StringMsgBox(Globals.hMainWnd, STRING_PRINTERROR,
+                        Globals.szFileName[0] ? Globals.szFileName : szUntitled,
+                        MB_ICONEXCLAMATION | MB_OK);
 }
 
 /**
@@ -298,20 +250,9 @@ static BOOL DoSaveFile(VOID)
     }
     size = GetWindowText(Globals.hEdit, pTemp, size);
 
-#ifndef UNICODE
-    pTemp = (LPTSTR)ConvertToUNICODE(pTemp, &size);
-    if (!pTemp)
-    {
-        /* original "pTemp" already freed */
-        CloseHandle(hFile);
-        ShowLastError();
-        return FALSE;
-    }
-#endif
-
     if (size)
     {
-        if (!WriteText(hFile, (LPWSTR)pTemp, size, Globals.iEncoding, Globals.iEoln))
+        if (!WriteText(hFile, (LPWSTR)pTemp, size, Globals.encFile, Globals.iEoln))
         {
             ShowLastError();
             bRet = FALSE;
@@ -385,18 +326,11 @@ VOID DoOpenFile(LPCTSTR szFileName)
         goto done;
     }
 
-    if (!ReadText(hFile, (LPWSTR *)&pszText, &dwTextLen, &Globals.iEncoding, &Globals.iEoln))
+    if (!ReadText(hFile, (LPWSTR *)&pszText, &dwTextLen, &Globals.encFile, &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);
@@ -406,7 +340,7 @@ VOID DoOpenFile(LPCTSTR szFileName)
     /*  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))
+    if (GetWindowText(Globals.hEdit, log, ARRAY_SIZE(log)) && !_tcscmp(log, dotlog))
     {
         static const TCHAR lf[] = _T("\r\n");
         SendMessage(Globals.hEdit, EM_SETSEL, GetWindowTextLength(Globals.hEdit), -1);
@@ -439,12 +373,10 @@ VOID DIALOG_FileNew(VOID)
 VOID DIALOG_FileOpen(VOID)
 {
     OPENFILENAME openfilename;
-    TCHAR szDir[MAX_PATH];
     TCHAR szPath[MAX_PATH];
 
     ZeroMemory(&openfilename, sizeof(openfilename));
 
-    GetCurrentDirectory(SIZEOF(szDir), szDir);
     if (Globals.szFileName[0] == 0)
         _tcscpy(szPath, txt_files);
     else
@@ -455,8 +387,7 @@ VOID DIALOG_FileOpen(VOID)
     openfilename.hInstance = Globals.hInstance;
     openfilename.lpstrFilter = Globals.szFilter;
     openfilename.lpstrFile = szPath;
-    openfilename.nMaxFile = SIZEOF(szPath);
-    openfilename.lpstrInitialDir = szDir;
+    openfilename.nMaxFile = ARRAY_SIZE(szPath);
     openfilename.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
     openfilename.lpstrDefExt = szDefaultExt;
 
@@ -490,29 +421,29 @@ DIALOG_FileSaveAs_Hook(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
         case WM_INITDIALOG:
             hCombo = GetDlgItem(hDlg, ID_ENCODING);
 
-            LoadString(Globals.hInstance, STRING_ANSI, szText, SIZEOF(szText));
+            LoadString(Globals.hInstance, STRING_ANSI, szText, ARRAY_SIZE(szText));
             SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
 
-            LoadString(Globals.hInstance, STRING_UNICODE, szText, SIZEOF(szText));
+            LoadString(Globals.hInstance, STRING_UNICODE, szText, ARRAY_SIZE(szText));
             SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
 
-            LoadString(Globals.hInstance, STRING_UNICODE_BE, szText, SIZEOF(szText));
+            LoadString(Globals.hInstance, STRING_UNICODE_BE, szText, ARRAY_SIZE(szText));
             SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
 
-            LoadString(Globals.hInstance, STRING_UTF8, szText, SIZEOF(szText));
+            LoadString(Globals.hInstance, STRING_UTF8, szText, ARRAY_SIZE(szText));
             SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
 
-            SendMessage(hCombo, CB_SETCURSEL, Globals.iEncoding, 0);
+            SendMessage(hCombo, CB_SETCURSEL, Globals.encFile, 0);
 
             hCombo = GetDlgItem(hDlg, ID_EOLN);
 
-            LoadString(Globals.hInstance, STRING_CRLF, szText, SIZEOF(szText));
+            LoadString(Globals.hInstance, STRING_CRLF, szText, ARRAY_SIZE(szText));
             SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
 
-            LoadString(Globals.hInstance, STRING_LF, szText, SIZEOF(szText));
+            LoadString(Globals.hInstance, STRING_LF, szText, ARRAY_SIZE(szText));
             SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
 
-            LoadString(Globals.hInstance, STRING_CR, szText, SIZEOF(szText));
+            LoadString(Globals.hInstance, STRING_CR, szText, ARRAY_SIZE(szText));
             SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM) szText);
 
             SendMessage(hCombo, CB_SETCURSEL, Globals.iEoln, 0);
@@ -523,7 +454,7 @@ DIALOG_FileSaveAs_Hook(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
             {
                 hCombo = GetDlgItem(hDlg, ID_ENCODING);
                 if (hCombo)
-                    Globals.iEncoding = (int) SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+                    Globals.encFile = (int) SendMessage(hCombo, CB_GETCURSEL, 0, 0);
 
                 hCombo = GetDlgItem(hDlg, ID_EOLN);
                 if (hCombo)
@@ -537,12 +468,10 @@ DIALOG_FileSaveAs_Hook(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 BOOL DIALOG_FileSaveAs(VOID)
 {
     OPENFILENAME saveas;
-    TCHAR szDir[MAX_PATH];
     TCHAR szPath[MAX_PATH];
 
     ZeroMemory(&saveas, sizeof(saveas));
 
-    GetCurrentDirectory(SIZEOF(szDir), szDir);
     if (Globals.szFileName[0] == 0)
         _tcscpy(szPath, txt_files);
     else
@@ -553,8 +482,7 @@ BOOL DIALOG_FileSaveAs(VOID)
     saveas.hInstance = Globals.hInstance;
     saveas.lpstrFilter = Globals.szFilter;
     saveas.lpstrFile = szPath;
-    saveas.nMaxFile = SIZEOF(szPath);
-    saveas.lpstrInitialDir = szDir;
+    saveas.nMaxFile = ARRAY_SIZE(szPath);
     saveas.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY |
                    OFN_EXPLORER | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
     saveas.lpstrDefExt = szDefaultExt;
@@ -587,6 +515,7 @@ BOOL DIALOG_FileSaveAs(VOID)
 VOID DIALOG_FilePrint(VOID)
 {
     DOCINFO di;
+    TEXTMETRIC tm;
     PRINTDLG printer;
     SIZE szMetric;
     int cWidthPels, cHeightPels, border;
@@ -629,18 +558,24 @@ VOID DIALOG_FilePrint(VOID)
     printer.nFromPage = 0;
     printer.nMinPage = 1;
     /* we really need to calculate number of pages to set nMaxPage and nToPage */
-    printer.nToPage = 0;
+    printer.nToPage = (WORD)-1;
     printer.nMaxPage = (WORD)-1;
 
     /* Let commdlg manage copy settings */
     printer.nCopies = (WORD)PD_USEDEVMODECOPIES;
 
+    printer.hDevMode = Globals.hDevMode;
+    printer.hDevNames = Globals.hDevNames;
+
     if (!PrintDlg(&printer))
     {
         DeleteObject(font);
         return;
     }
 
+    Globals.hDevMode = printer.hDevMode;
+    Globals.hDevNames = printer.hDevNames;
+
     assert(printer.hDC != 0);
 
     /* initialize DOCINFO */
@@ -688,65 +623,89 @@ VOID DIALOG_FilePrint(VOID)
         size = GetWindowText(Globals.hEdit, pTemp, size);
     }
 
+    /* Ensure that each logical unit maps to one pixel */
+    SetMapMode(printer.hDC, MM_TEXT);
+
+    /* Needed to get the correct height of a text line */
+    GetTextMetrics(printer.hDC, &tm);
+
     border = 150;
     for (copycount=1; copycount <= printer.nCopies; copycount++) {
         i = 0;
         pagecount = 1;
         do {
-            static const TCHAR letterM[] = _T("M");
+            /* Don't start a page if none of the conditions below are true */
+            dopage = 0;
+
+            /* The user wants to print the current selection */
+            if (printer.Flags & PD_SELECTION)
+            {
+                dopage = 1;
+            }
 
-            if (pagecount >= printer.nFromPage &&
-    /*          ((printer.Flags & PD_PAGENUMS) == 0 ||  pagecount <= printer.nToPage))*/
-            pagecount <= printer.nToPage)
+            /* The user wants to print the entire document */
+            if (!(printer.Flags & PD_PAGENUMS) && !(printer.Flags & PD_SELECTION))
+            {
                 dopage = 1;
-            else
-                dopage = 0;
+            }
+
+            /* The user wants to print a specified range of pages */
+            if ((pagecount >= printer.nFromPage && pagecount <= printer.nToPage))
+            {
+                dopage = 1;
+            }
 
             old_font = SelectObject(printer.hDC, font);
-            GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric);
 
             if (dopage) {
                 if (StartPage(printer.hDC) <= 0) {
-                    static const TCHAR failed[] = _T("StartPage failed");
-                    static const TCHAR error[] = _T("Print Error");
                     SelectObject(printer.hDC, old_font);
                     EndDoc(printer.hDC);
                     DeleteDC(printer.hDC);
                     HeapFree(GetProcessHeap(), 0, pTemp);
                     DeleteObject(font);
-                    MessageBox(Globals.hMainWnd, failed, error, MB_ICONEXCLAMATION);
+                    AlertPrintError();
                     return;
                 }
                 /* Write a rectangle and header at the top of each page */
-                Rectangle(printer.hDC, border, border, cWidthPels-border, border+szMetric.cy*2);
+                Rectangle(printer.hDC, border, border, cWidthPels-border, border + tm.tmHeight * 2);
                 /* I don't know what's up with this TextOut command. This comes out
                 kind of mangled.
                 */
                 TextOut(printer.hDC,
                         border * 2,
-                        border + szMetric.cy / 2,
+                        border + tm.tmHeight / 2,
                         Globals.szFileTitle,
                         lstrlen(Globals.szFileTitle));
             }
 
             /* The starting point for the main text */
             xLeft = border * 2;
-            yTop = border + szMetric.cy * 4;
+            yTop = border + tm.tmHeight * 4;
 
             SelectObject(printer.hDC, old_font);
-            GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric);
 
             /* Since outputting strings is giving me problems, output the main
              * text one character at a time. */
             do {
                 if (pTemp[i] == '\n') {
                     xLeft = border * 2;
-                    yTop += szMetric.cy;
+                    yTop += tm.tmHeight;
                 }
                 else if (pTemp[i] != '\r') {
                     if (dopage)
                         TextOut(printer.hDC, xLeft, yTop, &pTemp[i], 1);
+
+                    /* We need to get the width for each individual char, since a proportional font may be used */
+                    GetTextExtentPoint32(printer.hDC, &pTemp[i], 1, &szMetric);
                     xLeft += szMetric.cx;
+
+                    /* Insert a line break if the current line does not fit into the printing area */
+                    if (xLeft > (cWidthPels - border * 2))
+                    {
+                        xLeft = border * 2;
+                        yTop = yTop + tm.tmHeight;
+                    }
                 }
             } while (i++ < size && yTop < (cHeightPels - border * 2));
 
@@ -764,20 +723,6 @@ VOID DIALOG_FilePrint(VOID)
     DeleteObject(font);
 }
 
-VOID DIALOG_FilePrinterSetup(VOID)
-{
-    PRINTDLG printer;
-
-    ZeroMemory(&printer, sizeof(printer));
-    printer.lStructSize = sizeof(printer);
-    printer.hwndOwner = Globals.hMainWnd;
-    printer.hInstance = Globals.hInstance;
-    printer.Flags = PD_PRINTSETUP;
-    printer.nCopies = 1;
-
-    PrintDlg(&printer);
-}
-
 VOID DIALOG_FileExit(VOID)
 {
     PostMessage(Globals.hMainWnd, WM_CLOSE, 0, 0l);
@@ -974,6 +919,11 @@ VOID DoCreateEditWindow(VOID)
 
     if (Globals.hEdit == NULL)
     {
+        if (pTemp)
+        {
+            HeapFree(GetProcessHeap(), 0, pTemp);
+        }
+
         ShowLastError();
         return;
     }
@@ -1019,7 +969,7 @@ VOID DIALOG_SelectFont(VOID)
     cf.lStructSize = sizeof(cf);
     cf.hwndOwner = Globals.hMainWnd;
     cf.lpLogFont = &lf;
-    cf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT;
+    cf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT | CF_NOVERTFONTS;
 
     if (ChooseFont(&cf))
     {
@@ -1042,9 +992,9 @@ static VOID DIALOG_SearchDialog(FINDPROC pfnProc)
     Globals.find.hwndOwner = Globals.hMainWnd;
     Globals.find.hInstance = Globals.hInstance;
     Globals.find.lpstrFindWhat = Globals.szFindText;
-    Globals.find.wFindWhatLen = SIZEOF(Globals.szFindText);
+    Globals.find.wFindWhatLen = ARRAY_SIZE(Globals.szFindText);
     Globals.find.lpstrReplaceWith = Globals.szReplaceText;
-    Globals.find.wReplaceWithLen = SIZEOF(Globals.szReplaceText);
+    Globals.find.wReplaceWithLen = ARRAY_SIZE(Globals.szReplaceText);
     Globals.find.Flags = FR_DOWN;
 
     /* We only need to create the modal FindReplace dialog which will */
@@ -1083,7 +1033,7 @@ DIALOG_GoTo_DialogProc(HWND hwndDialog, UINT uMsg, WPARAM wParam, LPARAM lParam)
     switch(uMsg) {
     case WM_INITDIALOG:
         hTextBox = GetDlgItem(hwndDialog, ID_LINENUMBER);
-        _sntprintf(szText, SIZEOF(szText), _T("%ld"), lParam);
+        _sntprintf(szText, ARRAY_SIZE(szText), _T("%ld"), lParam);
         SetWindowText(hTextBox, szText);
         break;
     case WM_COMMAND:
@@ -1092,7 +1042,7 @@ DIALOG_GoTo_DialogProc(HWND hwndDialog, UINT uMsg, WPARAM wParam, LPARAM lParam)
             if (LOWORD(wParam) == IDOK)
             {
                 hTextBox = GetDlgItem(hwndDialog, ID_LINENUMBER);
-                GetWindowText(hTextBox, szText, SIZEOF(szText));
+                GetWindowText(hTextBox, szText, ARRAY_SIZE(szText));
                 EndDialog(hwndDialog, _ttoi(szText));
                 bResult = TRUE;
             }
@@ -1176,19 +1126,16 @@ VOID DIALOG_HelpContents(VOID)
     WinHelp(Globals.hMainWnd, helpfile, HELP_INDEX, 0);
 }
 
-VOID DIALOG_HelpSearch(VOID)
+VOID DIALOG_HelpAboutNotepad(VOID)
 {
-    /* Search Help */
-}
+    TCHAR szNotepad[MAX_STRING_LEN];
+    HICON notepadIcon = LoadIcon(Globals.hInstance, MAKEINTRESOURCE(IDI_NPICON));
 
-VOID DIALOG_HelpHelp(VOID)
-{
-    WinHelp(Globals.hMainWnd, helpfile, HELP_HELPONHELP, 0);
+    LoadString(Globals.hInstance, STRING_NOTEPAD, szNotepad, ARRAY_SIZE(szNotepad));
+    ShellAbout(Globals.hMainWnd, szNotepad, 0, notepadIcon);
+    DeleteObject(notepadIcon);
 }
 
-#ifdef _MSC_VER
-#pragma warning(disable : 4100)
-#endif
 INT_PTR
 CALLBACK
 AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
@@ -1224,36 +1171,44 @@ AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
     return 0;
 }
 
-VOID DIALOG_HelpAboutWine(VOID)
-{
-    TCHAR szNotepad[MAX_STRING_LEN];
-    HICON notepadIcon = LoadIcon(Globals.hInstance, MAKEINTRESOURCE(IDI_NPICON));
-
-    LoadString(Globals.hInstance, STRING_NOTEPAD, szNotepad, SIZEOF(szNotepad));
-    ShellAbout(Globals.hMainWnd, szNotepad, 0, notepadIcon);
-    DeleteObject(notepadIcon);
-}
-
 /***********************************************************************
  *
  *           DIALOG_FilePageSetup
  */
 VOID DIALOG_FilePageSetup(void)
 {
-    DialogBox(Globals.hInstance,
-              MAKEINTRESOURCE(DIALOG_PAGESETUP),
-              Globals.hMainWnd,
-              DIALOG_PAGESETUP_DlgProc);
+    PAGESETUPDLG page;
+
+    ZeroMemory(&page, sizeof(page));
+    page.lStructSize = sizeof(page);
+    page.hwndOwner = Globals.hMainWnd;
+    page.Flags = PSD_ENABLEPAGESETUPTEMPLATE | PSD_ENABLEPAGESETUPHOOK | PSD_MARGINS;
+    page.hInstance = Globals.hInstance;
+    page.rtMargin.left = Globals.lMarginLeft;
+    page.rtMargin.top = Globals.lMarginTop;
+    page.rtMargin.right = Globals.lMarginRight;
+    page.rtMargin.bottom = Globals.lMarginBottom;
+    page.hDevMode = Globals.hDevMode;
+    page.hDevNames = Globals.hDevNames;
+    page.lpPageSetupTemplateName = MAKEINTRESOURCE(DIALOG_PAGESETUP);
+    page.lpfnPageSetupHook = DIALOG_PAGESETUP_Hook;
+
+    PageSetupDlg(&page);
+
+    Globals.hDevMode = page.hDevMode;
+    Globals.hDevNames = page.hDevNames;
+    Globals.lMarginLeft = page.rtMargin.left;
+    Globals.lMarginTop = page.rtMargin.top;
+    Globals.lMarginRight = page.rtMargin.right;
+    Globals.lMarginBottom = page.rtMargin.bottom;
 }
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  *
- *           DIALOG_PAGESETUP_DlgProc
+ *           DIALOG_PAGESETUP_Hook
  */
 
-static INT_PTR
-WINAPI
-DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+static UINT_PTR CALLBACK DIALOG_PAGESETUP_Hook(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 {
     switch (msg)
     {
@@ -1264,19 +1219,13 @@ DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
             {
             case IDOK:
                 /* save user input and close dialog */
-                GetDlgItemText(hDlg, 0x141, Globals.szHeader, SIZEOF(Globals.szHeader));
-                GetDlgItemText(hDlg, 0x143, Globals.szFooter, SIZEOF(Globals.szFooter));
-                GetDlgItemText(hDlg, 0x14A, Globals.szMarginTop, SIZEOF(Globals.szMarginTop));
-                GetDlgItemText(hDlg, 0x150, Globals.szMarginBottom, SIZEOF(Globals.szMarginBottom));
-                GetDlgItemText(hDlg, 0x147, Globals.szMarginLeft, SIZEOF(Globals.szMarginLeft));
-                GetDlgItemText(hDlg, 0x14D, Globals.szMarginRight, SIZEOF(Globals.szMarginRight));
-                EndDialog(hDlg, IDOK);
-                return TRUE;
+                GetDlgItemText(hDlg, 0x141, Globals.szHeader, ARRAY_SIZE(Globals.szHeader));
+                GetDlgItemText(hDlg, 0x143, Globals.szFooter, ARRAY_SIZE(Globals.szFooter));
+                return FALSE;
 
             case IDCANCEL:
                 /* discard user input and close dialog */
-                EndDialog(hDlg, IDCANCEL);
-                return TRUE;
+                return FALSE;
 
             case IDHELP:
                 {
@@ -1297,10 +1246,6 @@ DIALOG_PAGESETUP_DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
         /* fetch last user input prior to display dialog */
         SetDlgItemText(hDlg, 0x141, Globals.szHeader);
         SetDlgItemText(hDlg, 0x143, Globals.szFooter);
-        SetDlgItemText(hDlg, 0x14A, Globals.szMarginTop);
-        SetDlgItemText(hDlg, 0x150, Globals.szMarginBottom);
-        SetDlgItemText(hDlg, 0x147, Globals.szMarginLeft);
-        SetDlgItemText(hDlg, 0x14D, Globals.szMarginRight);
         break;
     }