From 61876c72054459002aedf2ef3e714f0e5d144ed6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Nicolaysen=20S=C3=B8rnes?= Date: Thu, 23 Aug 2007 01:36:29 +0200 Subject: [PATCH] wordpad: Add initial printing support. --- programs/wordpad/De.rc | 9 ++- programs/wordpad/En.rc | 9 ++- programs/wordpad/Fr.rc | 9 ++- programs/wordpad/Hu.rc | 9 ++- programs/wordpad/Ko.rc | 15 +++-- programs/wordpad/Nl.rc | 9 ++- programs/wordpad/No.rc | 7 ++ programs/wordpad/Pl.rc | 9 ++- programs/wordpad/Ru.rc | 9 ++- programs/wordpad/Tr.rc | 9 ++- programs/wordpad/resource.h | 4 +- programs/wordpad/rsrc.rc | 1 + programs/wordpad/wordpad.c | 128 ++++++++++++++++++++++++++++++++++++ 13 files changed, 214 insertions(+), 13 deletions(-) diff --git a/programs/wordpad/De.rc b/programs/wordpad/De.rc index 59bf46be4cd..4941f498b5c 100644 --- a/programs/wordpad/De.rc +++ b/programs/wordpad/De.rc @@ -27,6 +27,8 @@ BEGIN MENUITEM "&Speichern\tCtrl+S", ID_FILE_SAVE MENUITEM "Speichern &unter...", ID_FILE_SAVEAS MENUITEM SEPARATOR + MENUITEM "&Print . . .\tCtrl+P", ID_PRINT + MENUITEM SEPARATOR MENUITEM "&Beenden", ID_FILE_EXIT END POPUP "&Bearbeiten" @@ -156,7 +158,12 @@ END STRINGTABLE DISCARDABLE BEGIN -STRING_UNITS_CM, "cm" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" END STRINGTABLE DISCARDABLE diff --git a/programs/wordpad/En.rc b/programs/wordpad/En.rc index be576f653ce..ac300457ba5 100644 --- a/programs/wordpad/En.rc +++ b/programs/wordpad/En.rc @@ -27,6 +27,8 @@ BEGIN MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE MENUITEM "Save &as . . .", ID_FILE_SAVEAS MENUITEM SEPARATOR + MENUITEM "&Print . . .\tCtrl+P", ID_PRINT + MENUITEM SEPARATOR MENUITEM "E&xit", ID_FILE_EXIT END POPUP "&Edit" @@ -157,7 +159,12 @@ END STRINGTABLE DISCARDABLE BEGIN -STRING_UNITS_CM, "cm" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" END STRINGTABLE DISCARDABLE diff --git a/programs/wordpad/Fr.rc b/programs/wordpad/Fr.rc index b1f8c0c8d30..b6ed430c6cb 100644 --- a/programs/wordpad/Fr.rc +++ b/programs/wordpad/Fr.rc @@ -27,6 +27,8 @@ BEGIN MENUITEM "&Enregistrer\tCtrl+S", ID_FILE_SAVE MENUITEM "Enregistrer &sous...", ID_FILE_SAVEAS MENUITEM SEPARATOR + MENUITEM "&Print . . .\tCtrl+P", ID_PRINT + MENUITEM SEPARATOR MENUITEM "&Quitter", ID_FILE_EXIT END POPUP "É&dition" @@ -156,7 +158,12 @@ END STRINGTABLE DISCARDABLE BEGIN -STRING_UNITS_CM, "cm" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" END STRINGTABLE DISCARDABLE diff --git a/programs/wordpad/Hu.rc b/programs/wordpad/Hu.rc index 4ba225e4ab1..9bd06828824 100644 --- a/programs/wordpad/Hu.rc +++ b/programs/wordpad/Hu.rc @@ -27,6 +27,8 @@ BEGIN MENUITEM "M&entés\tCtrl+S", ID_FILE_SAVE MENUITEM "Mentés má&sként...", ID_FILE_SAVEAS MENUITEM SEPARATOR + MENUITEM "&Print . . .\tCtrl+P", ID_PRINT + MENUITEM SEPARATOR MENUITEM "&Kilépés", ID_FILE_EXIT END POPUP "Sz&erkesztés" @@ -156,7 +158,12 @@ END STRINGTABLE DISCARDABLE BEGIN -STRING_UNITS_CM, "cm" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" END STRINGTABLE DISCARDABLE diff --git a/programs/wordpad/Ko.rc b/programs/wordpad/Ko.rc index bd03994ad47..65ad9e04bfb 100644 --- a/programs/wordpad/Ko.rc +++ b/programs/wordpad/Ko.rc @@ -28,6 +28,8 @@ BEGIN MENUITEM "ÀúÀå(&S)\tCtrl+S", ID_FILE_SAVE MENUITEM "´Ù¸¥ À̸§À¸·Î ÀúÀå(&A)...", ID_FILE_SAVEAS MENUITEM SEPARATOR + MENUITEM "&Print . . .\tCtrl+P", ID_PRINT + MENUITEM SEPARATOR MENUITEM "³ª°¡±â(&X)", ID_FILE_EXIT END POPUP "ÆíÁý(&E)" @@ -143,14 +145,19 @@ END STRINGTABLE DISCARDABLE BEGIN -STRING_UNITS_CM, "cm" + STRING_ALIGN_LEFT, "Left" + STRING_ALIGN_RIGHT, "Right" + STRING_ALIGN_CENTER, "Center" END STRINGTABLE DISCARDABLE BEGIN - STRING_ALIGN_LEFT, "Left" - STRING_ALIGN_RIGHT, "Right" - STRING_ALIGN_CENTER, "Center" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" END STRINGTABLE DISCARDABLE diff --git a/programs/wordpad/Nl.rc b/programs/wordpad/Nl.rc index 2d63e85ca41..b5a4b332faf 100644 --- a/programs/wordpad/Nl.rc +++ b/programs/wordpad/Nl.rc @@ -27,6 +27,8 @@ BEGIN MENUITEM "O&pslaan\tCtrl+S", ID_FILE_SAVE MENUITEM "Ops&laan als...", ID_FILE_SAVEAS MENUITEM SEPARATOR + MENUITEM "&Print . . .\tCtrl+P", ID_PRINT + MENUITEM SEPARATOR MENUITEM "&Afsluiten", ID_FILE_EXIT END POPUP "Be&werken" @@ -156,7 +158,12 @@ END STRINGTABLE DISCARDABLE BEGIN -STRING_UNITS_CM, "cm" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" END STRINGTABLE DISCARDABLE diff --git a/programs/wordpad/No.rc b/programs/wordpad/No.rc index b2d685b131a..e6a2457c68d 100644 --- a/programs/wordpad/No.rc +++ b/programs/wordpad/No.rc @@ -27,6 +27,8 @@ BEGIN MENUITEM "&Lagre\tCtrl+S", ID_FILE_SAVE MENUITEM "Lagre &som . . .", ID_FILE_SAVEAS MENUITEM SEPARATOR + MENUITEM "&Skriv ut . . .\tCtrl+P", ID_PRINT + MENUITEM SEPARATOR MENUITEM "&Avslutt", ID_FILE_EXIT END POPUP "R&ediger" @@ -154,6 +156,11 @@ BEGIN STRING_ALIGN_CENTER, "Midtstilt" END +STRINGTABLE DISCARDABLE +BEGIN + STRING_PRINTER_FILES_PRN, "Skriverfiler (*.PRN)" +END + STRINGTABLE DISCARDABLE BEGIN STRING_UNITS_CM, "cm" diff --git a/programs/wordpad/Pl.rc b/programs/wordpad/Pl.rc index 1819e1b5fea..782a008a0f8 100644 --- a/programs/wordpad/Pl.rc +++ b/programs/wordpad/Pl.rc @@ -28,6 +28,8 @@ BEGIN MENUITEM "&Zapisz\tCtrl+S", ID_FILE_SAVE MENUITEM "Z&apisz jako...", ID_FILE_SAVEAS MENUITEM SEPARATOR + MENUITEM "&Print . . .\tCtrl+P", ID_PRINT + MENUITEM SEPARATOR MENUITEM "Za&koñcz", ID_FILE_EXIT END POPUP "&Edycja" @@ -157,7 +159,12 @@ END STRINGTABLE DISCARDABLE BEGIN -STRING_UNITS_CM, "cm" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" END STRINGTABLE DISCARDABLE diff --git a/programs/wordpad/Ru.rc b/programs/wordpad/Ru.rc index 6677dabf3e4..453d961544a 100644 --- a/programs/wordpad/Ru.rc +++ b/programs/wordpad/Ru.rc @@ -27,6 +27,8 @@ BEGIN MENUITEM "&Ñîõðàíèòü\tCtrl+S", ID_FILE_SAVE MENUITEM "Ñîõðàíèòü &êàê...", ID_FILE_SAVEAS MENUITEM SEPARATOR + MENUITEM "&Print . . .\tCtrl+P", ID_PRINT + MENUITEM SEPARATOR MENUITEM "Â&ûõîä", ID_FILE_EXIT END POPUP "&Ïðàâêà" @@ -154,7 +156,12 @@ END STRINGTABLE DISCARDABLE BEGIN -STRING_UNITS_CM, "cm" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" END STRINGTABLE DISCARDABLE diff --git a/programs/wordpad/Tr.rc b/programs/wordpad/Tr.rc index 3d0190695ea..c3f06c97bd7 100644 --- a/programs/wordpad/Tr.rc +++ b/programs/wordpad/Tr.rc @@ -29,6 +29,8 @@ BEGIN MENUITEM "&Kaydet\tCtrl+S", ID_FILE_SAVE MENUITEM "&Farklý Kaydet...", ID_FILE_SAVEAS MENUITEM SEPARATOR + MENUITEM "&Print . . .\tCtrl+P", ID_PRINT + MENUITEM SEPARATOR MENUITEM "&Çýk", ID_FILE_EXIT END POPUP "&Düzen" @@ -158,7 +160,12 @@ END STRINGTABLE DISCARDABLE BEGIN -STRING_UNITS_CM, "cm" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" END STRINGTABLE DISCARDABLE diff --git a/programs/wordpad/resource.h b/programs/wordpad/resource.h index 95374a88aac..ea7b52a4a22 100644 --- a/programs/wordpad/resource.h +++ b/programs/wordpad/resource.h @@ -120,7 +120,9 @@ #define STRING_ALIGN_RIGHT 1408 #define STRING_ALIGN_CENTER 1409 -#define STRING_UNITS_CM 1410 +#define STRING_PRINTER_FILES_PRN 1410 + +#define STRING_UNITS_CM 1411 #define STRING_DEFAULT_FILENAME 1700 #define STRING_PROMPT_SAVE_CHANGES 1701 diff --git a/programs/wordpad/rsrc.rc b/programs/wordpad/rsrc.rc index d53e6f48376..ee192523f58 100644 --- a/programs/wordpad/rsrc.rc +++ b/programs/wordpad/rsrc.rc @@ -41,6 +41,7 @@ BEGIN "N", ID_FILE_NEW, VIRTKEY, CONTROL "O", ID_FILE_OPEN, VIRTKEY, CONTROL "S", ID_FILE_SAVE, VIRTKEY, CONTROL + "P", ID_PRINT, VIRTKEY, CONTROL END /* BINRES toolbar.bmp */ diff --git a/programs/wordpad/wordpad.c b/programs/wordpad/wordpad.c index b06f3096856..5b84b251cd7 100644 --- a/programs/wordpad/wordpad.c +++ b/programs/wordpad/wordpad.c @@ -68,6 +68,7 @@ static UINT ID_FINDMSGSTRING; static WCHAR wszFilter[MAX_STRING_LEN*4+6*3+5]; static WCHAR wszDefaultFileName[MAX_STRING_LEN]; static WCHAR wszSaveChanges[MAX_STRING_LEN]; +static WCHAR wszPrintFilter[MAX_STRING_LEN*2+6+4+1]; static WCHAR units_cmW[MAX_STRING_LEN]; static char units_cmA[MAX_STRING_LEN]; @@ -81,6 +82,7 @@ static void DoLoadStrings(void) static const WCHAR files_rtf[] = {'*','.','r','t','f','\0'}; static const WCHAR files_txt[] = {'*','.','t','x','t','\0'}; static const WCHAR files_all[] = {'*','.','*','\0'}; + static const WCHAR files_prn[] = {'*','.','P','R','N',0}; HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); LoadStringW(hInstance, STRING_RICHTEXT_FILES_RTF, p, MAX_STRING_LEN); @@ -101,6 +103,17 @@ static void DoLoadStrings(void) p += lstrlenW(p) + 1; *p = '\0'; + p = wszPrintFilter; + LoadStringW(hInstance, STRING_PRINTER_FILES_PRN, p, MAX_STRING_LEN); + p += lstrlenW(p) + 1; + lstrcpyW(p, files_prn); + p += lstrlenW(p) + 1; + LoadStringW(hInstance, STRING_ALL_FILES, p, MAX_STRING_LEN); + p += lstrlenW(p) + 1; + lstrcpyW(p, files_all); + p += lstrlenW(p) + 1; + *p = 0; + p = wszDefaultFileName; LoadStringW(hInstance, STRING_DEFAULT_FILENAME, p, MAX_STRING_LEN); @@ -874,6 +887,118 @@ static void DialogOpenFile(void) } } +static LPWSTR dialog_print_to_file(void) +{ + OPENFILENAMEW ofn; + static WCHAR file[MAX_PATH] = {'O','U','T','P','U','T','.','P','R','N',0}; + static const WCHAR defExt[] = {'P','R','N',0}; + + ZeroMemory(&ofn, sizeof(ofn)); + + ofn.lStructSize = sizeof(ofn); + ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; + ofn.hwndOwner = hMainWnd; + ofn.lpstrFilter = (LPWSTR)wszPrintFilter; + ofn.lpstrFile = (LPWSTR)file; + ofn.nMaxFile = MAX_PATH; + ofn.lpstrDefExt = (LPWSTR)defExt; + + if(GetSaveFileNameW(&ofn)) + return (LPWSTR)file; + else + return FALSE; +} + +static LONG devunits_to_twips(int units, int dpi) +{ + float ret = ((float)units / (float)dpi) * (float)567 * 2.54; + return (LONG)ret; +} + +static void print(LPPRINTDLGW pd) +{ + FORMATRANGE fr; + DOCINFOW di; + int dpiY, dpiX, width, height; + + fr.hdc = pd->hDC; + fr.hdcTarget = pd->hDC; + + dpiY = GetDeviceCaps(fr.hdc, LOGPIXELSY); + dpiX = GetDeviceCaps(fr.hdc, LOGPIXELSX); + width = devunits_to_twips(GetDeviceCaps(fr.hdc, PHYSICALWIDTH), dpiX); + height = devunits_to_twips(GetDeviceCaps(fr.hdc, PHYSICALHEIGHT), dpiY); + + fr.rc.left = devunits_to_twips(GetDeviceCaps(fr.hdc, PHYSICALOFFSETX), dpiX); + fr.rc.right = width - (fr.rc.left * 2); + fr.rc.top = devunits_to_twips(GetDeviceCaps(fr.hdc, PHYSICALOFFSETY), dpiY); + fr.rc.bottom = height - (fr.rc.top * 2); + fr.rcPage.left = 0; + fr.rcPage.right = width; + fr.rcPage.top = 0; + fr.rcPage.bottom = height; + + ZeroMemory(&di, sizeof(di)); + di.cbSize = sizeof(di); + di.lpszDocName = (LPWSTR)wszFileName; + + if(pd->Flags & PD_PRINTTOFILE) + { + di.lpszOutput = dialog_print_to_file(); + if(!di.lpszOutput) + return; + } + + if(pd->Flags & PD_SELECTION) + { + SendMessageW(hEditorWnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg); + } else + { + GETTEXTLENGTHEX gt; + gt.flags = GTL_DEFAULT; + gt.codepage = 1200; + fr.chrg.cpMin = 0; + fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); + } + + StartDocW(fr.hdc, &di); + do + { + if(StartPage(fr.hdc) <= 0) + break; + + fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr); + + if(EndPage(fr.hdc) <= 0) + break; + } + while(fr.chrg.cpMin < fr.chrg.cpMax); + + EndDoc(fr.hdc); + SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0); +} + +static void dialog_print(void) +{ + PRINTDLGW pd; + int from = 0; + int to = 0; + + ZeroMemory(&pd, sizeof(pd)); + pd.lStructSize = sizeof(pd); + pd.hwndOwner = hMainWnd; + pd.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE; + pd.nMinPage = 1; + pd.nMaxPage = 1; + + SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&from, (LPARAM)&to); + if(from == to) + pd.Flags |= PD_NOSELECTION; + + if(PrintDlgW(&pd)) + print(&pd); +} + static void HandleCommandLine(LPWSTR cmdline) { WCHAR delimiter; @@ -1698,6 +1823,9 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) break; case ID_PRINT: + dialog_print(); + break; + case ID_PREVIEW: { static const WCHAR wszNotImplemented[] = {'N','o','t',' ',