1999-02-28 21:05:11 +01:00
/*
* COMMDLG - Print Dialog
*
* Copyright 1994 Martin Ayotte
* Copyright 1996 Albrecht Kleine
* Copyright 1999 Klaas van Gend
2000-05-27 00:26:06 +02:00
* Copyright 2000 Huw D M Davies
2002-03-10 00:29:33 +01:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
2006-05-18 14:49:52 +02:00
* Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 , USA
1999-02-28 21:05:11 +01:00
*/
# include <ctype.h>
# include <stdlib.h>
2003-09-06 01:08:26 +02:00
# include <stdarg.h>
2000-02-10 20:03:02 +01:00
# include <stdio.h>
1999-02-28 21:05:11 +01:00
# include <string.h>
2003-01-07 21:36:20 +01:00
# define NONAMELESSUNION
# define NONAMELESSSTRUCT
2000-02-10 20:03:02 +01:00
# include "windef.h"
1999-02-28 21:05:11 +01:00
# include "winbase.h"
2000-02-10 20:03:02 +01:00
# include "wingdi.h"
2000-05-27 00:26:06 +02:00
# include "winuser.h"
2003-10-08 00:51:09 +02:00
# include "winspool.h"
# include "winerror.h"
# include "wine/debug.h"
1999-02-28 21:05:11 +01:00
# include "commdlg.h"
# include "dlgs.h"
1999-03-13 18:07:56 +01:00
# include "cderr.h"
1999-02-28 21:05:11 +01:00
2002-03-10 00:29:33 +01:00
WINE_DEFAULT_DEBUG_CHANNEL ( commdlg ) ;
1999-04-19 16:56:29 +02:00
1999-04-25 20:31:35 +02:00
# include "cdlg.h"
2003-08-02 02:41:41 +02:00
# include "printdlg.h"
1999-04-25 20:31:35 +02:00
2003-08-02 02:41:41 +02:00
/* Yes these constants are the same, but we're just copying win98 */
# define UPDOWN_ID 0x270f
# define MAX_COPIES 9999
1999-08-07 14:34:54 +02:00
2001-05-05 02:44:03 +02:00
/* Debugging info */
2006-11-29 11:04:52 +01:00
static const struct pd_flags psd_flags [ ] = {
2001-05-05 02:44:03 +02:00
{ PSD_MINMARGINS , " PSD_MINMARGINS " } ,
{ PSD_MARGINS , " PSD_MARGINS " } ,
{ PSD_INTHOUSANDTHSOFINCHES , " PSD_INTHOUSANDTHSOFINCHES " } ,
{ PSD_INHUNDREDTHSOFMILLIMETERS , " PSD_INHUNDREDTHSOFMILLIMETERS " } ,
{ PSD_DISABLEMARGINS , " PSD_DISABLEMARGINS " } ,
{ PSD_DISABLEPRINTER , " PSD_DISABLEPRINTER " } ,
{ PSD_NOWARNING , " PSD_NOWARNING " } ,
{ PSD_DISABLEORIENTATION , " PSD_DISABLEORIENTATION " } ,
{ PSD_RETURNDEFAULT , " PSD_RETURNDEFAULT " } ,
{ PSD_DISABLEPAPER , " PSD_DISABLEPAPER " } ,
{ PSD_SHOWHELP , " PSD_SHOWHELP " } ,
{ PSD_ENABLEPAGESETUPHOOK , " PSD_ENABLEPAGESETUPHOOK " } ,
{ PSD_ENABLEPAGESETUPTEMPLATE , " PSD_ENABLEPAGESETUPTEMPLATE " } ,
{ PSD_ENABLEPAGESETUPTEMPLATEHANDLE , " PSD_ENABLEPAGESETUPTEMPLATEHANDLE " } ,
{ PSD_ENABLEPAGEPAINTHOOK , " PSD_ENABLEPAGEPAINTHOOK " } ,
{ PSD_DISABLEPAGEPAINTING , " PSD_DISABLEPAGEPAINTING " } ,
{ - 1 , NULL }
} ;
2005-01-24 12:26:23 +01:00
/* address of wndproc for subclassed Static control */
static WNDPROC lpfnStaticWndProc ;
/* the text of the fake document to render for the Page Setup dialog */
static WCHAR wszFakeDocumentText [ 1024 ] ;
1999-02-28 21:05:11 +01:00
/***********************************************************************
2000-05-27 00:26:06 +02:00
* PRINTDLG_OpenDefaultPrinter
1999-11-13 21:49:58 +01:00
*
2000-05-27 00:26:06 +02:00
* Returns a winspool printer handle to the default printer in * hprn
* Caller must call ClosePrinter on the handle
1999-11-13 21:49:58 +01:00
*
2000-05-27 00:26:06 +02:00
* Returns TRUE on success else FALSE
1999-02-28 21:05:11 +01:00
*/
2003-08-02 02:41:41 +02:00
BOOL PRINTDLG_OpenDefaultPrinter ( HANDLE * hprn )
1999-02-28 21:05:11 +01:00
{
2005-03-14 11:07:11 +01:00
WCHAR buf [ 260 ] ;
DWORD dwBufLen = sizeof ( buf ) / sizeof ( buf [ 0 ] ) ;
2001-01-02 23:26:09 +01:00
BOOL res ;
2005-03-14 11:07:11 +01:00
if ( ! GetDefaultPrinterW ( buf , & dwBufLen ) )
2000-05-27 00:26:06 +02:00
return FALSE ;
2005-03-14 11:07:11 +01:00
res = OpenPrinterW ( buf , hprn , NULL ) ;
2001-01-02 23:26:09 +01:00
if ( ! res )
2005-03-14 11:07:11 +01:00
WARN ( " Could not open printer %s \n " , debugstr_w ( buf ) ) ;
2001-01-02 23:26:09 +01:00
return res ;
2000-05-27 00:26:06 +02:00
}
1999-10-13 14:29:57 +02:00
2000-05-27 00:26:06 +02:00
/***********************************************************************
* PRINTDLG_SetUpPrinterListCombo
*
* Initializes printer list combox .
* hDlg : HWND of dialog
* id : Control id of combo
* name : Name of printer to select
*
* Initializes combo with list of available printers . Selects printer ' name '
* If name is NULL or does not exist select the default printer .
*
* Returns number of printers added to list .
*/
2003-08-02 02:41:41 +02:00
INT PRINTDLG_SetUpPrinterListComboA ( HWND hDlg , UINT id , LPCSTR name )
2000-05-27 00:26:06 +02:00
{
DWORD needed , num ;
INT i ;
LPPRINTER_INFO_2A pi ;
EnumPrintersA ( PRINTER_ENUM_LOCAL , NULL , 2 , NULL , 0 , & needed , & num ) ;
pi = HeapAlloc ( GetProcessHeap ( ) , 0 , needed ) ;
2002-06-01 01:06:46 +02:00
EnumPrintersA ( PRINTER_ENUM_LOCAL , NULL , 2 , ( LPBYTE ) pi , needed , & needed ,
2000-05-27 00:26:06 +02:00
& num ) ;
2005-07-07 20:23:45 +02:00
SendDlgItemMessageA ( hDlg , id , CB_RESETCONTENT , 0 , 0 ) ;
2000-05-27 00:26:06 +02:00
for ( i = 0 ; i < num ; i + + ) {
SendDlgItemMessageA ( hDlg , id , CB_ADDSTRING , 0 ,
( LPARAM ) pi [ i ] . pPrinterName ) ;
1999-04-25 20:31:35 +02:00
}
2000-05-27 00:26:06 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , pi ) ;
if ( ! name | |
( i = SendDlgItemMessageA ( hDlg , id , CB_FINDSTRINGEXACT , - 1 ,
( LPARAM ) name ) ) = = CB_ERR ) {
char buf [ 260 ] ;
2004-01-02 02:49:31 +01:00
DWORD dwBufLen = sizeof ( buf ) ;
2001-01-02 23:26:09 +01:00
FIXME ( " Can't find '%s' in printer list so trying to find default \n " ,
2000-05-27 00:26:06 +02:00
name ) ;
2004-01-02 02:49:31 +01:00
if ( ! GetDefaultPrinterA ( buf , & dwBufLen ) )
2000-05-27 00:26:06 +02:00
return num ;
i = SendDlgItemMessageA ( hDlg , id , CB_FINDSTRINGEXACT , - 1 , ( LPARAM ) buf ) ;
if ( i = = CB_ERR )
2001-01-02 23:26:09 +01:00
FIXME ( " Can't find default printer in printer list \n " ) ;
1999-04-25 20:31:35 +02:00
}
2000-05-27 00:26:06 +02:00
SendDlgItemMessageA ( hDlg , id , CB_SETCURSEL , i , 0 ) ;
return num ;
1999-02-28 21:05:11 +01:00
}
2002-04-11 19:32:49 +02:00
static INT PRINTDLG_SetUpPrinterListComboW ( HWND hDlg , UINT id , LPCWSTR name )
{
DWORD needed , num ;
INT i ;
LPPRINTER_INFO_2W pi ;
EnumPrintersW ( PRINTER_ENUM_LOCAL , NULL , 2 , NULL , 0 , & needed , & num ) ;
pi = HeapAlloc ( GetProcessHeap ( ) , 0 , needed ) ;
2002-06-01 01:06:46 +02:00
EnumPrintersW ( PRINTER_ENUM_LOCAL , NULL , 2 , ( LPBYTE ) pi , needed , & needed ,
2002-04-11 19:32:49 +02:00
& num ) ;
for ( i = 0 ; i < num ; i + + ) {
SendDlgItemMessageW ( hDlg , id , CB_ADDSTRING , 0 ,
( LPARAM ) pi [ i ] . pPrinterName ) ;
}
HeapFree ( GetProcessHeap ( ) , 0 , pi ) ;
if ( ! name | |
( i = SendDlgItemMessageW ( hDlg , id , CB_FINDSTRINGEXACT , - 1 ,
( LPARAM ) name ) ) = = CB_ERR ) {
2004-09-22 21:11:05 +02:00
WCHAR buf [ 260 ] ;
DWORD dwBufLen = sizeof ( buf ) / sizeof ( buf [ 0 ] ) ;
TRACE ( " Can't find '%s' in printer list so trying to find default \n " ,
2002-04-11 19:32:49 +02:00
debugstr_w ( name ) ) ;
2004-09-22 21:11:05 +02:00
if ( ! GetDefaultPrinterW ( buf , & dwBufLen ) )
2002-04-11 19:32:49 +02:00
return num ;
2004-09-22 21:11:05 +02:00
i = SendDlgItemMessageW ( hDlg , id , CB_FINDSTRINGEXACT , - 1 , ( LPARAM ) buf ) ;
2002-04-11 19:32:49 +02:00
if ( i = = CB_ERR )
2004-09-22 21:11:05 +02:00
TRACE ( " Can't find default printer in printer list \n " ) ;
2002-04-11 19:32:49 +02:00
}
SendDlgItemMessageW ( hDlg , id , CB_SETCURSEL , i , 0 ) ;
return num ;
}
1999-02-28 21:05:11 +01:00
/***********************************************************************
2000-05-27 00:26:06 +02:00
* PRINTDLG_CreateDevNames [ internal ]
1999-02-28 21:05:11 +01:00
*
*
2000-05-27 00:26:06 +02:00
* creates a DevNames structure .
1999-02-28 21:05:11 +01:00
*
2000-05-27 00:26:06 +02:00
* ( NB . when we handle unicode the offsets will be in wchars ) .
1999-02-28 21:05:11 +01:00
*/
2007-04-06 11:56:15 +02:00
static BOOL PRINTDLG_CreateDevNames ( HGLOBAL * hmem , const char * DeviceDriverName ,
const char * DeviceName , const char * OutputPort )
1999-02-28 21:05:11 +01:00
{
2000-05-27 00:26:06 +02:00
long size ;
char * pDevNamesSpace ;
char * pTempPtr ;
LPDEVNAMES lpDevNames ;
char buf [ 260 ] ;
2004-01-02 02:49:31 +01:00
DWORD dwBufLen = sizeof ( buf ) ;
1999-11-13 21:49:58 +01:00
2000-05-27 00:26:06 +02:00
size = strlen ( DeviceDriverName ) + 1
+ strlen ( DeviceName ) + 1
+ strlen ( OutputPort ) + 1
+ sizeof ( DEVNAMES ) ;
2002-06-01 01:06:46 +02:00
2000-05-27 00:26:06 +02:00
if ( * hmem )
* hmem = GlobalReAlloc ( * hmem , size , GMEM_MOVEABLE ) ;
1999-05-02 13:34:26 +02:00
else
2000-05-27 00:26:06 +02:00
* hmem = GlobalAlloc ( GMEM_MOVEABLE , size ) ;
if ( * hmem = = 0 )
1999-08-15 18:33:11 +02:00
return FALSE ;
1999-08-07 14:34:54 +02:00
2000-05-27 00:26:06 +02:00
pDevNamesSpace = GlobalLock ( * hmem ) ;
lpDevNames = ( LPDEVNAMES ) pDevNamesSpace ;
1999-02-28 21:05:11 +01:00
2000-05-27 00:26:06 +02:00
pTempPtr = pDevNamesSpace + sizeof ( DEVNAMES ) ;
strcpy ( pTempPtr , DeviceDriverName ) ;
lpDevNames - > wDriverOffset = pTempPtr - pDevNamesSpace ;
1999-02-28 21:05:11 +01:00
2000-05-27 00:26:06 +02:00
pTempPtr + = strlen ( DeviceDriverName ) + 1 ;
strcpy ( pTempPtr , DeviceName ) ;
lpDevNames - > wDeviceOffset = pTempPtr - pDevNamesSpace ;
2002-06-01 01:06:46 +02:00
2000-05-27 00:26:06 +02:00
pTempPtr + = strlen ( DeviceName ) + 1 ;
strcpy ( pTempPtr , OutputPort ) ;
lpDevNames - > wOutputOffset = pTempPtr - pDevNamesSpace ;
2004-01-02 02:49:31 +01:00
GetDefaultPrinterA ( buf , & dwBufLen ) ;
2000-05-27 00:26:06 +02:00
lpDevNames - > wDefault = ( strcmp ( buf , DeviceName ) = = 0 ) ? 1 : 0 ;
GlobalUnlock ( * hmem ) ;
return TRUE ;
}
1999-02-28 21:05:11 +01:00
2002-06-01 01:06:46 +02:00
static BOOL PRINTDLG_CreateDevNamesW ( HGLOBAL * hmem , LPCWSTR DeviceDriverName ,
2002-04-11 19:32:49 +02:00
LPCWSTR DeviceName , LPCWSTR OutputPort )
{
long size ;
LPWSTR pDevNamesSpace ;
LPWSTR pTempPtr ;
LPDEVNAMES lpDevNames ;
WCHAR bufW [ 260 ] ;
2004-01-02 02:49:31 +01:00
DWORD dwBufLen = sizeof ( bufW ) / sizeof ( WCHAR ) ;
2002-04-11 19:32:49 +02:00
size = sizeof ( WCHAR ) * lstrlenW ( DeviceDriverName ) + 2
+ sizeof ( WCHAR ) * lstrlenW ( DeviceName ) + 2
+ sizeof ( WCHAR ) * lstrlenW ( OutputPort ) + 2
+ sizeof ( DEVNAMES ) ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
if ( * hmem )
* hmem = GlobalReAlloc ( * hmem , size , GMEM_MOVEABLE ) ;
else
* hmem = GlobalAlloc ( GMEM_MOVEABLE , size ) ;
if ( * hmem = = 0 )
return FALSE ;
pDevNamesSpace = GlobalLock ( * hmem ) ;
lpDevNames = ( LPDEVNAMES ) pDevNamesSpace ;
pTempPtr = ( LPWSTR ) ( ( LPDEVNAMES ) pDevNamesSpace + 1 ) ;
lstrcpyW ( pTempPtr , DeviceDriverName ) ;
lpDevNames - > wDriverOffset = pTempPtr - pDevNamesSpace ;
pTempPtr + = lstrlenW ( DeviceDriverName ) + 1 ;
lstrcpyW ( pTempPtr , DeviceName ) ;
lpDevNames - > wDeviceOffset = pTempPtr - pDevNamesSpace ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
pTempPtr + = lstrlenW ( DeviceName ) + 1 ;
lstrcpyW ( pTempPtr , OutputPort ) ;
lpDevNames - > wOutputOffset = pTempPtr - pDevNamesSpace ;
2004-01-02 02:49:31 +01:00
GetDefaultPrinterW ( bufW , & dwBufLen ) ;
2002-04-11 19:32:49 +02:00
lpDevNames - > wDefault = ( lstrcmpW ( bufW , DeviceName ) = = 0 ) ? 1 : 0 ;
GlobalUnlock ( * hmem ) ;
return TRUE ;
}
1999-02-28 21:05:11 +01:00
/***********************************************************************
2000-05-27 00:26:06 +02:00
* PRINTDLG_UpdatePrintDlg [ internal ]
*
*
2003-06-18 05:30:39 +02:00
* updates the PrintDlg structure for return values .
2002-06-01 01:06:46 +02:00
*
2000-05-27 00:26:06 +02:00
* RETURNS
* FALSE if user is not allowed to close ( i . e . wrong nTo or nFrom values )
2003-06-18 05:30:39 +02:00
* TRUE if successful .
1999-02-28 21:05:11 +01:00
*/
2002-06-01 01:06:46 +02:00
static BOOL PRINTDLG_UpdatePrintDlgA ( HWND hDlg ,
2000-05-27 00:26:06 +02:00
PRINT_PTRA * PrintStructures )
1999-02-28 21:05:11 +01:00
{
2004-01-09 06:10:35 +01:00
LPPRINTDLGA lppd = PrintStructures - > lpPrintDlg ;
2000-05-27 00:26:06 +02:00
PDEVMODEA lpdm = PrintStructures - > lpDevMode ;
LPPRINTER_INFO_2A pi = PrintStructures - > lpPrinterInfo ;
2001-01-02 23:26:09 +01:00
if ( ! lpdm ) {
FIXME ( " No lpdm ptr? \n " ) ;
return FALSE ;
}
2000-05-27 00:26:06 +02:00
if ( ! ( lppd - > Flags & PD_PRINTSETUP ) ) {
/* check whether nFromPage and nToPage are within range defined by
* nMinPage and nMaxPage
*/
if ( IsDlgButtonChecked ( hDlg , rad3 ) = = BST_CHECKED ) { /* Pages */
WORD nToPage ;
WORD nFromPage ;
nFromPage = GetDlgItemInt ( hDlg , edt1 , NULL , FALSE ) ;
nToPage = GetDlgItemInt ( hDlg , edt2 , NULL , FALSE ) ;
if ( nFromPage < lppd - > nMinPage | | nFromPage > lppd - > nMaxPage | |
nToPage < lppd - > nMinPage | | nToPage > lppd - > nMaxPage ) {
char resourcestr [ 256 ] ;
char resultstr [ 256 ] ;
2002-06-01 01:06:46 +02:00
LoadStringA ( COMDLG32_hInstance , PD32_INVALID_PAGE_RANGE ,
2000-05-27 00:26:06 +02:00
resourcestr , 255 ) ;
sprintf ( resultstr , resourcestr , lppd - > nMinPage , lppd - > nMaxPage ) ;
2002-06-01 01:06:46 +02:00
LoadStringA ( COMDLG32_hInstance , PD32_PRINT_TITLE ,
2000-05-27 00:26:06 +02:00
resourcestr , 255 ) ;
MessageBoxA ( hDlg , resultstr , resourcestr ,
MB_OK | MB_ICONWARNING ) ;
return FALSE ;
}
lppd - > nFromPage = nFromPage ;
lppd - > nToPage = nToPage ;
2002-10-21 20:22:31 +02:00
lppd - > Flags | = PD_PAGENUMS ;
2000-05-27 00:26:06 +02:00
}
2002-10-21 20:22:31 +02:00
else
lppd - > Flags & = ~ PD_PAGENUMS ;
1999-02-28 21:05:11 +01:00
2007-07-25 21:08:33 +02:00
if ( IsDlgButtonChecked ( hDlg , rad2 ) = = BST_CHECKED ) /* Selection */
lppd - > Flags | = PD_SELECTION ;
else
lppd - > Flags & = ~ PD_SELECTION ;
2000-05-27 00:26:06 +02:00
if ( IsDlgButtonChecked ( hDlg , chx1 ) = = BST_CHECKED ) { /* Print to file */
2006-05-23 21:05:53 +02:00
static char file [ ] = " FILE: " ;
2000-05-27 00:26:06 +02:00
lppd - > Flags | = PD_PRINTTOFILE ;
2006-05-23 21:05:53 +02:00
pi - > pPortName = file ;
2000-05-27 00:26:06 +02:00
}
1999-02-28 21:05:11 +01:00
2000-05-27 00:26:06 +02:00
if ( IsDlgButtonChecked ( hDlg , chx2 ) = = BST_CHECKED ) { /* Collate */
FIXME ( " Collate lppd not yet implemented as output \n " ) ;
}
1999-09-03 14:41:23 +02:00
2000-05-27 00:26:06 +02:00
/* set PD_Collate and nCopies */
if ( lppd - > Flags & PD_USEDEVMODECOPIESANDCOLLATE ) {
/* The application doesn't support multiple copies or collate...
*/
lppd - > Flags & = ~ PD_COLLATE ;
lppd - > nCopies = 1 ;
/* if the printer driver supports it... store info there
* otherwise no collate & multiple copies !
*/
if ( lpdm - > dmFields & DM_COLLATE )
2002-06-01 01:06:46 +02:00
lpdm - > dmCollate =
2000-05-27 00:26:06 +02:00
( IsDlgButtonChecked ( hDlg , chx2 ) = = BST_CHECKED ) ;
if ( lpdm - > dmFields & DM_COPIES )
lpdm - > dmCopies = GetDlgItemInt ( hDlg , edt3 , NULL , FALSE ) ;
} else {
if ( IsDlgButtonChecked ( hDlg , chx2 ) = = BST_CHECKED )
lppd - > Flags | = PD_COLLATE ;
else
lppd - > Flags & = ~ PD_COLLATE ;
lppd - > nCopies = GetDlgItemInt ( hDlg , edt3 , NULL , FALSE ) ;
}
}
return TRUE ;
1999-05-02 13:34:26 +02:00
}
2002-06-01 01:06:46 +02:00
static BOOL PRINTDLG_UpdatePrintDlgW ( HWND hDlg ,
2002-04-11 19:32:49 +02:00
PRINT_PTRW * PrintStructures )
{
2004-01-09 06:10:35 +01:00
LPPRINTDLGW lppd = PrintStructures - > lpPrintDlg ;
2002-04-11 19:32:49 +02:00
PDEVMODEW lpdm = PrintStructures - > lpDevMode ;
LPPRINTER_INFO_2W pi = PrintStructures - > lpPrinterInfo ;
if ( ! lpdm ) {
FIXME ( " No lpdm ptr? \n " ) ;
return FALSE ;
}
if ( ! ( lppd - > Flags & PD_PRINTSETUP ) ) {
/* check whether nFromPage and nToPage are within range defined by
* nMinPage and nMaxPage
*/
if ( IsDlgButtonChecked ( hDlg , rad3 ) = = BST_CHECKED ) { /* Pages */
WORD nToPage ;
WORD nFromPage ;
nFromPage = GetDlgItemInt ( hDlg , edt1 , NULL , FALSE ) ;
nToPage = GetDlgItemInt ( hDlg , edt2 , NULL , FALSE ) ;
if ( nFromPage < lppd - > nMinPage | | nFromPage > lppd - > nMaxPage | |
nToPage < lppd - > nMinPage | | nToPage > lppd - > nMaxPage ) {
2004-09-22 21:11:05 +02:00
WCHAR resourcestr [ 256 ] ;
WCHAR resultstr [ 256 ] ;
LoadStringW ( COMDLG32_hInstance , PD32_INVALID_PAGE_RANGE ,
2002-04-11 19:32:49 +02:00
resourcestr , 255 ) ;
2004-09-22 21:11:05 +02:00
wsprintfW ( resultstr , resourcestr , lppd - > nMinPage , lppd - > nMaxPage ) ;
LoadStringW ( COMDLG32_hInstance , PD32_PRINT_TITLE ,
2002-04-11 19:32:49 +02:00
resourcestr , 255 ) ;
2004-09-22 21:11:05 +02:00
MessageBoxW ( hDlg , resultstr , resourcestr ,
2002-04-11 19:32:49 +02:00
MB_OK | MB_ICONWARNING ) ;
return FALSE ;
}
lppd - > nFromPage = nFromPage ;
lppd - > nToPage = nToPage ;
2006-07-16 04:10:00 +02:00
lppd - > Flags | = PD_PAGENUMS ;
2002-04-11 19:32:49 +02:00
}
2006-07-16 04:10:00 +02:00
else
lppd - > Flags & = ~ PD_PAGENUMS ;
2002-04-11 19:32:49 +02:00
2007-07-25 21:08:33 +02:00
if ( IsDlgButtonChecked ( hDlg , rad2 ) = = BST_CHECKED ) /* Selection */
lppd - > Flags | = PD_SELECTION ;
else
lppd - > Flags & = ~ PD_SELECTION ;
2002-04-11 19:32:49 +02:00
if ( IsDlgButtonChecked ( hDlg , chx1 ) = = BST_CHECKED ) { /* Print to file */
static WCHAR file [ ] = { ' F ' , ' I ' , ' L ' , ' E ' , ' : ' , 0 } ;
lppd - > Flags | = PD_PRINTTOFILE ;
pi - > pPortName = file ;
}
if ( IsDlgButtonChecked ( hDlg , chx2 ) = = BST_CHECKED ) { /* Collate */
FIXME ( " Collate lppd not yet implemented as output \n " ) ;
}
/* set PD_Collate and nCopies */
if ( lppd - > Flags & PD_USEDEVMODECOPIESANDCOLLATE ) {
/* The application doesn't support multiple copies or collate...
*/
lppd - > Flags & = ~ PD_COLLATE ;
lppd - > nCopies = 1 ;
/* if the printer driver supports it... store info there
* otherwise no collate & multiple copies !
*/
if ( lpdm - > dmFields & DM_COLLATE )
2002-06-01 01:06:46 +02:00
lpdm - > dmCollate =
2002-04-11 19:32:49 +02:00
( IsDlgButtonChecked ( hDlg , chx2 ) = = BST_CHECKED ) ;
if ( lpdm - > dmFields & DM_COPIES )
lpdm - > dmCopies = GetDlgItemInt ( hDlg , edt3 , NULL , FALSE ) ;
} else {
if ( IsDlgButtonChecked ( hDlg , chx2 ) = = BST_CHECKED )
lppd - > Flags | = PD_COLLATE ;
else
lppd - > Flags & = ~ PD_COLLATE ;
lppd - > nCopies = GetDlgItemInt ( hDlg , edt3 , NULL , FALSE ) ;
}
}
return TRUE ;
}
static BOOL PRINTDLG_PaperSizeA (
2005-07-07 20:23:45 +02:00
PRINTDLGA * pdlga , const WORD PaperSize , LPPOINT size
2001-05-05 02:44:03 +02:00
) {
DEVNAMES * dn ;
DEVMODEA * dm ;
LPSTR devname , portname ;
int i ;
2001-07-28 01:55:51 +02:00
INT NrOfEntries , ret ;
2005-07-07 20:23:45 +02:00
WORD * Words = NULL ;
2001-05-05 02:44:03 +02:00
POINT * points = NULL ;
BOOL retval = FALSE ;
2002-06-01 01:06:46 +02:00
2001-05-05 02:44:03 +02:00
dn = GlobalLock ( pdlga - > hDevNames ) ;
dm = GlobalLock ( pdlga - > hDevMode ) ;
devname = ( ( char * ) dn ) + dn - > wDeviceOffset ;
portname = ( ( char * ) dn ) + dn - > wOutputOffset ;
NrOfEntries = DeviceCapabilitiesA ( devname , portname , DC_PAPERNAMES , NULL , dm ) ;
if ( ! NrOfEntries ) {
FIXME ( " No papernames found for %s/%s \n " , devname , portname ) ;
goto out ;
}
2001-07-28 01:55:51 +02:00
if ( NrOfEntries = = - 1 ) {
ERR ( " Hmm ? DeviceCapabilities() DC_PAPERNAMES failed, ret -1 ! \n " ) ;
goto out ;
}
2002-06-01 01:06:46 +02:00
2005-07-07 20:23:45 +02:00
Words = HeapAlloc ( GetProcessHeap ( ) , 0 , NrOfEntries * sizeof ( WORD ) ) ;
if ( NrOfEntries ! = ( ret = DeviceCapabilitiesA ( devname , portname , DC_PAPERS , ( LPSTR ) Words , dm ) ) ) {
2001-07-28 01:55:51 +02:00
FIXME ( " Number of returned vals %d is not %d \n " , NrOfEntries , ret ) ;
2001-05-05 02:44:03 +02:00
goto out ;
}
for ( i = 0 ; i < NrOfEntries ; i + + )
2005-07-07 20:23:45 +02:00
if ( Words [ i ] = = PaperSize )
2001-05-05 02:44:03 +02:00
break ;
2005-07-07 20:23:45 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , Words ) ;
if ( i = = NrOfEntries ) {
FIXME ( " Papersize %d not found in list? \n " , PaperSize ) ;
2001-05-05 02:44:03 +02:00
goto out ;
}
points = HeapAlloc ( GetProcessHeap ( ) , 0 , sizeof ( points [ 0 ] ) * NrOfEntries ) ;
2005-07-05 16:11:04 +02:00
if ( NrOfEntries ! = ( ret = DeviceCapabilitiesA ( devname , portname , DC_PAPERSIZE , ( LPSTR ) points , dm ) ) ) {
2001-07-28 01:55:51 +02:00
FIXME ( " Number of returned sizes %d is not %d? \n " , NrOfEntries , ret ) ;
2001-05-05 02:44:03 +02:00
goto out ;
}
/* this is _10ths_ of a millimeter */
size - > x = points [ i ] . x ;
size - > y = points [ i ] . y ;
2002-04-11 19:32:49 +02:00
retval = TRUE ;
out :
GlobalUnlock ( pdlga - > hDevNames ) ;
GlobalUnlock ( pdlga - > hDevMode ) ;
2005-07-07 20:23:45 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , Words ) ;
2004-12-23 18:06:43 +01:00
HeapFree ( GetProcessHeap ( ) , 0 , points ) ;
2002-04-11 19:32:49 +02:00
return retval ;
}
static BOOL PRINTDLG_PaperSizeW (
PRINTDLGW * pdlga , const WCHAR * PaperSize , LPPOINT size
) {
DEVNAMES * dn ;
DEVMODEW * dm ;
LPWSTR devname , portname ;
int i ;
INT NrOfEntries , ret ;
WCHAR * Names = NULL ;
POINT * points = NULL ;
BOOL retval = FALSE ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
dn = GlobalLock ( pdlga - > hDevNames ) ;
dm = GlobalLock ( pdlga - > hDevMode ) ;
devname = ( ( WCHAR * ) dn ) + dn - > wDeviceOffset ;
portname = ( ( WCHAR * ) dn ) + dn - > wOutputOffset ;
NrOfEntries = DeviceCapabilitiesW ( devname , portname , DC_PAPERNAMES , NULL , dm ) ;
if ( ! NrOfEntries ) {
FIXME ( " No papernames found for %s/%s \n " , debugstr_w ( devname ) , debugstr_w ( portname ) ) ;
goto out ;
}
if ( NrOfEntries = = - 1 ) {
ERR ( " Hmm ? DeviceCapabilities() DC_PAPERNAMES failed, ret -1 ! \n " ) ;
goto out ;
}
2002-06-01 01:06:46 +02:00
2005-03-24 22:01:35 +01:00
Names = HeapAlloc ( GetProcessHeap ( ) , 0 , sizeof ( WCHAR ) * NrOfEntries * 64 ) ;
2002-04-11 19:32:49 +02:00
if ( NrOfEntries ! = ( ret = DeviceCapabilitiesW ( devname , portname , DC_PAPERNAMES , Names , dm ) ) ) {
FIXME ( " Number of returned vals %d is not %d \n " , NrOfEntries , ret ) ;
goto out ;
}
for ( i = 0 ; i < NrOfEntries ; i + + )
if ( ! lstrcmpW ( PaperSize , Names + ( 64 * i ) ) )
break ;
HeapFree ( GetProcessHeap ( ) , 0 , Names ) ;
if ( i = = NrOfEntries ) {
FIXME ( " Papersize %s not found in list? \n " , debugstr_w ( PaperSize ) ) ;
goto out ;
}
points = HeapAlloc ( GetProcessHeap ( ) , 0 , sizeof ( points [ 0 ] ) * NrOfEntries ) ;
if ( NrOfEntries ! = ( ret = DeviceCapabilitiesW ( devname , portname , DC_PAPERSIZE , ( LPWSTR ) points , dm ) ) ) {
FIXME ( " Number of returned sizes %d is not %d? \n " , NrOfEntries , ret ) ;
goto out ;
}
/* this is _10ths_ of a millimeter */
size - > x = points [ i ] . x ;
size - > y = points [ i ] . y ;
2001-05-05 02:44:03 +02:00
retval = TRUE ;
out :
GlobalUnlock ( pdlga - > hDevNames ) ;
GlobalUnlock ( pdlga - > hDevMode ) ;
2004-12-23 18:06:43 +01:00
HeapFree ( GetProcessHeap ( ) , 0 , Names ) ;
HeapFree ( GetProcessHeap ( ) , 0 , points ) ;
2001-05-05 02:44:03 +02:00
return retval ;
}
2000-05-27 00:26:06 +02:00
/************************************************************************
* PRINTDLG_SetUpPaperComboBox
1999-11-13 21:49:58 +01:00
*
2000-05-27 00:26:06 +02:00
* Initialize either the papersize or inputslot combos of the Printer Setup
* dialog . We store the associated word ( eg DMPAPER_A4 ) as the item data .
* We also try to re - select the old selection .
1999-11-13 21:49:58 +01:00
*/
2002-04-11 19:32:49 +02:00
static BOOL PRINTDLG_SetUpPaperComboBoxA ( HWND hDlg ,
2000-05-27 00:26:06 +02:00
int nIDComboBox ,
2002-06-01 01:06:46 +02:00
char * PrinterName ,
2000-05-27 00:26:06 +02:00
char * PortName ,
LPDEVMODEA dm )
1999-11-13 21:49:58 +01:00
{
int i ;
2001-09-11 01:14:22 +02:00
int NrOfEntries ;
1999-11-13 21:49:58 +01:00
char * Names ;
2000-05-27 00:26:06 +02:00
WORD * Words ;
DWORD Sel ;
WORD oldWord = 0 ;
1999-11-13 21:49:58 +01:00
int NamesSize ;
int fwCapability_Names ;
int fwCapability_Words ;
2002-06-01 01:06:46 +02:00
2001-09-11 01:14:22 +02:00
TRACE ( " Printer: %s, Port: %s, ComboID: %d \n " , PrinterName , PortName , nIDComboBox ) ;
2002-06-01 01:06:46 +02:00
1999-11-13 21:49:58 +01:00
/* query the dialog box for the current selected value */
2000-05-27 00:26:06 +02:00
Sel = SendDlgItemMessageA ( hDlg , nIDComboBox , CB_GETCURSEL , 0 , 0 ) ;
if ( Sel ! = CB_ERR ) {
2001-02-12 20:42:08 +01:00
/* we enter here only if a different printer is selected after
* the Print Setup dialog is opened . The current settings are
* stored into the newly selected printer .
*/
oldWord = SendDlgItemMessageA ( hDlg , nIDComboBox , CB_GETITEMDATA ,
Sel , 0 ) ;
if ( dm ) {
if ( nIDComboBox = = cmb2 )
dm - > u1 . s1 . dmPaperSize = oldWord ;
else
dm - > dmDefaultSource = oldWord ;
}
}
else {
/* we enter here only when the Print setup dialog is initially
* opened . In this case the settings are restored from when
* the dialog was last closed .
*/
if ( dm ) {
if ( nIDComboBox = = cmb2 )
oldWord = dm - > u1 . s1 . dmPaperSize ;
else
oldWord = dm - > dmDefaultSource ;
}
2000-05-27 00:26:06 +02:00
}
1999-11-13 21:49:58 +01:00
2000-05-27 00:26:06 +02:00
if ( nIDComboBox = = cmb2 ) {
1999-11-13 21:49:58 +01:00
NamesSize = 64 ;
fwCapability_Names = DC_PAPERNAMES ;
fwCapability_Words = DC_PAPERS ;
2000-05-27 00:26:06 +02:00
} else {
1999-11-13 21:49:58 +01:00
nIDComboBox = cmb3 ;
NamesSize = 24 ;
fwCapability_Names = DC_BINNAMES ;
fwCapability_Words = DC_BINS ;
2000-05-27 00:26:06 +02:00
}
2002-06-01 01:06:46 +02:00
/* for some printer drivers, DeviceCapabilities calls a VXD to obtain the
1999-11-13 21:49:58 +01:00
* paper settings . As Wine doesn ' t allow VXDs , this results in a crash .
*/
WARN ( " if your printer driver uses VXDs, expect a crash now! \n " ) ;
NrOfEntries = DeviceCapabilitiesA ( PrinterName , PortName ,
2000-05-27 00:26:06 +02:00
fwCapability_Names , NULL , dm ) ;
1999-11-13 21:49:58 +01:00
if ( NrOfEntries = = 0 )
2000-05-27 00:26:06 +02:00
WARN ( " no Name Entries found! \n " ) ;
2001-09-11 01:14:22 +02:00
else if ( NrOfEntries < 0 )
return FALSE ;
2000-05-27 00:26:06 +02:00
if ( DeviceCapabilitiesA ( PrinterName , PortName , fwCapability_Words , NULL , dm )
! = NrOfEntries ) {
ERR ( " Number of caps is different \n " ) ;
NrOfEntries = 0 ;
}
2002-04-11 19:32:49 +02:00
Names = HeapAlloc ( GetProcessHeap ( ) , 0 , NrOfEntries * sizeof ( char ) * NamesSize ) ;
2000-05-27 00:26:06 +02:00
Words = HeapAlloc ( GetProcessHeap ( ) , 0 , NrOfEntries * sizeof ( WORD ) ) ;
1999-11-13 21:49:58 +01:00
NrOfEntries = DeviceCapabilitiesA ( PrinterName , PortName ,
2000-05-27 00:26:06 +02:00
fwCapability_Names , Names , dm ) ;
NrOfEntries = DeviceCapabilitiesA ( PrinterName , PortName ,
fwCapability_Words , ( LPSTR ) Words , dm ) ;
1999-11-13 21:49:58 +01:00
/* reset any current content in the combobox */
SendDlgItemMessageA ( hDlg , nIDComboBox , CB_RESETCONTENT , 0 , 0 ) ;
2002-06-01 01:06:46 +02:00
1999-11-13 21:49:58 +01:00
/* store new content */
2000-05-27 00:26:06 +02:00
for ( i = 0 ; i < NrOfEntries ; i + + ) {
DWORD pos = SendDlgItemMessageA ( hDlg , nIDComboBox , CB_ADDSTRING , 0 ,
( LPARAM ) ( & Names [ i * NamesSize ] ) ) ;
2002-06-01 01:06:46 +02:00
SendDlgItemMessageA ( hDlg , nIDComboBox , CB_SETITEMDATA , pos ,
2000-05-27 00:26:06 +02:00
Words [ i ] ) ;
}
1999-11-13 21:49:58 +01:00
2000-05-27 00:26:06 +02:00
/* Look for old selection - can't do this is previous loop since
item order will change as more items are added */
Sel = 0 ;
for ( i = 0 ; i < NrOfEntries ; i + + ) {
if ( SendDlgItemMessageA ( hDlg , nIDComboBox , CB_GETITEMDATA , i , 0 ) = =
oldWord ) {
Sel = i ;
break ;
}
}
SendDlgItemMessageA ( hDlg , nIDComboBox , CB_SETCURSEL , Sel , 0 ) ;
1999-11-13 21:49:58 +01:00
2000-05-27 00:26:06 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , Words ) ;
HeapFree ( GetProcessHeap ( ) , 0 , Names ) ;
return TRUE ;
}
1999-02-28 21:05:11 +01:00
2002-04-11 19:32:49 +02:00
static BOOL PRINTDLG_SetUpPaperComboBoxW ( HWND hDlg ,
int nIDComboBox ,
2007-04-06 11:56:15 +02:00
const WCHAR * PrinterName ,
const WCHAR * PortName ,
2002-04-11 19:32:49 +02:00
LPDEVMODEW dm )
1999-02-28 21:05:11 +01:00
{
2002-04-11 19:32:49 +02:00
int i ;
int NrOfEntries ;
WCHAR * Names ;
WORD * Words ;
DWORD Sel ;
WORD oldWord = 0 ;
int NamesSize ;
int fwCapability_Names ;
int fwCapability_Words ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
TRACE ( " Printer: %s, Port: %s, ComboID: %d \n " , debugstr_w ( PrinterName ) , debugstr_w ( PortName ) , nIDComboBox ) ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
/* query the dialog box for the current selected value */
2004-09-22 21:11:05 +02:00
Sel = SendDlgItemMessageW ( hDlg , nIDComboBox , CB_GETCURSEL , 0 , 0 ) ;
2002-04-11 19:32:49 +02:00
if ( Sel ! = CB_ERR ) {
/* we enter here only if a different printer is selected after
* the Print Setup dialog is opened . The current settings are
* stored into the newly selected printer .
*/
2004-09-22 21:11:05 +02:00
oldWord = SendDlgItemMessageW ( hDlg , nIDComboBox , CB_GETITEMDATA ,
2002-04-11 19:32:49 +02:00
Sel , 0 ) ;
if ( dm ) {
if ( nIDComboBox = = cmb2 )
dm - > u1 . s1 . dmPaperSize = oldWord ;
else
dm - > dmDefaultSource = oldWord ;
}
}
else {
/* we enter here only when the Print setup dialog is initially
* opened . In this case the settings are restored from when
* the dialog was last closed .
*/
if ( dm ) {
if ( nIDComboBox = = cmb2 )
oldWord = dm - > u1 . s1 . dmPaperSize ;
else
oldWord = dm - > dmDefaultSource ;
1999-05-02 13:34:26 +02:00
}
2000-05-27 00:26:06 +02:00
}
1999-05-02 13:34:26 +02:00
2002-04-11 19:32:49 +02:00
if ( nIDComboBox = = cmb2 ) {
NamesSize = 64 ;
fwCapability_Names = DC_PAPERNAMES ;
fwCapability_Words = DC_PAPERS ;
} else {
nIDComboBox = cmb3 ;
NamesSize = 24 ;
fwCapability_Names = DC_BINNAMES ;
fwCapability_Words = DC_BINS ;
}
2002-06-01 01:06:46 +02:00
/* for some printer drivers, DeviceCapabilities calls a VXD to obtain the
2002-04-11 19:32:49 +02:00
* paper settings . As Wine doesn ' t allow VXDs , this results in a crash .
*/
WARN ( " if your printer driver uses VXDs, expect a crash now! \n " ) ;
NrOfEntries = DeviceCapabilitiesW ( PrinterName , PortName ,
fwCapability_Names , NULL , dm ) ;
if ( NrOfEntries = = 0 )
WARN ( " no Name Entries found! \n " ) ;
else if ( NrOfEntries < 0 )
return FALSE ;
if ( DeviceCapabilitiesW ( PrinterName , PortName , fwCapability_Words , NULL , dm )
! = NrOfEntries ) {
ERR ( " Number of caps is different \n " ) ;
NrOfEntries = 0 ;
}
Names = HeapAlloc ( GetProcessHeap ( ) , 0 , NrOfEntries * sizeof ( WCHAR ) * NamesSize ) ;
Words = HeapAlloc ( GetProcessHeap ( ) , 0 , NrOfEntries * sizeof ( WORD ) ) ;
NrOfEntries = DeviceCapabilitiesW ( PrinterName , PortName ,
fwCapability_Names , Names , dm ) ;
NrOfEntries = DeviceCapabilitiesW ( PrinterName , PortName ,
fwCapability_Words , ( LPWSTR ) Words , dm ) ;
/* reset any current content in the combobox */
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , nIDComboBox , CB_RESETCONTENT , 0 , 0 ) ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
/* store new content */
for ( i = 0 ; i < NrOfEntries ; i + + ) {
DWORD pos = SendDlgItemMessageW ( hDlg , nIDComboBox , CB_ADDSTRING , 0 ,
( LPARAM ) ( & Names [ i * NamesSize ] ) ) ;
2002-06-01 01:06:46 +02:00
SendDlgItemMessageW ( hDlg , nIDComboBox , CB_SETITEMDATA , pos ,
2002-04-11 19:32:49 +02:00
Words [ i ] ) ;
}
/* Look for old selection - can't do this is previous loop since
item order will change as more items are added */
Sel = 0 ;
for ( i = 0 ; i < NrOfEntries ; i + + ) {
2004-09-22 21:11:05 +02:00
if ( SendDlgItemMessageW ( hDlg , nIDComboBox , CB_GETITEMDATA , i , 0 ) = =
2002-04-11 19:32:49 +02:00
oldWord ) {
Sel = i ;
break ;
}
}
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , nIDComboBox , CB_SETCURSEL , Sel , 0 ) ;
2002-04-11 19:32:49 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , Words ) ;
HeapFree ( GetProcessHeap ( ) , 0 , Names ) ;
return TRUE ;
}
/***********************************************************************
* PRINTDLG_UpdatePrinterInfoTexts [ internal ]
*/
2007-04-06 11:56:15 +02:00
static void PRINTDLG_UpdatePrinterInfoTextsA ( HWND hDlg , const PRINTER_INFO_2A * pi )
2002-04-11 19:32:49 +02:00
{
char StatusMsg [ 256 ] ;
char ResourceString [ 256 ] ;
int i ;
/* Status Message */
StatusMsg [ 0 ] = ' \0 ' ;
/* add all status messages */
for ( i = 0 ; i < 25 ; i + + ) {
if ( pi - > Status & ( 1 < < i ) ) {
2002-06-01 01:06:46 +02:00
LoadStringA ( COMDLG32_hInstance , PD32_PRINTER_STATUS_PAUSED + i ,
2002-04-11 19:32:49 +02:00
ResourceString , 255 ) ;
strcat ( StatusMsg , ResourceString ) ;
}
}
/* append "ready" */
2002-06-01 01:06:46 +02:00
/* FIXME: status==ready must only be appended if really so.
2002-04-11 19:32:49 +02:00
but how to detect ? */
2002-06-01 01:06:46 +02:00
LoadStringA ( COMDLG32_hInstance , PD32_PRINTER_STATUS_READY ,
2002-04-11 19:32:49 +02:00
ResourceString , 255 ) ;
strcat ( StatusMsg , ResourceString ) ;
2003-05-14 02:02:17 +02:00
SetDlgItemTextA ( hDlg , stc12 , StatusMsg ) ;
2002-04-11 19:32:49 +02:00
/* set all other printer info texts */
2003-05-14 02:02:17 +02:00
SetDlgItemTextA ( hDlg , stc11 , pi - > pDriverName ) ;
2002-04-11 19:32:49 +02:00
if ( pi - > pLocation ! = NULL & & pi - > pLocation [ 0 ] ! = ' \0 ' )
2003-05-14 02:02:17 +02:00
SetDlgItemTextA ( hDlg , stc14 , pi - > pLocation ) ;
2002-04-11 19:32:49 +02:00
else
2003-05-14 02:02:17 +02:00
SetDlgItemTextA ( hDlg , stc14 , pi - > pPortName ) ;
SetDlgItemTextA ( hDlg , stc13 , pi - > pComment ? pi - > pComment : " " ) ;
2002-04-11 19:32:49 +02:00
return ;
}
2007-04-06 11:56:15 +02:00
static void PRINTDLG_UpdatePrinterInfoTextsW ( HWND hDlg , const PRINTER_INFO_2W * pi )
2002-04-11 19:32:49 +02:00
{
WCHAR StatusMsg [ 256 ] ;
WCHAR ResourceString [ 256 ] ;
2003-05-14 02:02:17 +02:00
static const WCHAR emptyW [ ] = { 0 } ;
2002-04-11 19:32:49 +02:00
int i ;
/* Status Message */
StatusMsg [ 0 ] = ' \0 ' ;
/* add all status messages */
for ( i = 0 ; i < 25 ; i + + ) {
if ( pi - > Status & ( 1 < < i ) ) {
2002-06-01 01:06:46 +02:00
LoadStringW ( COMDLG32_hInstance , PD32_PRINTER_STATUS_PAUSED + i ,
2002-04-11 19:32:49 +02:00
ResourceString , 255 ) ;
lstrcatW ( StatusMsg , ResourceString ) ;
}
}
/* append "ready" */
2002-06-01 01:06:46 +02:00
/* FIXME: status==ready must only be appended if really so.
2002-04-11 19:32:49 +02:00
but how to detect ? */
2002-06-01 01:06:46 +02:00
LoadStringW ( COMDLG32_hInstance , PD32_PRINTER_STATUS_READY ,
2002-04-11 19:32:49 +02:00
ResourceString , 255 ) ;
lstrcatW ( StatusMsg , ResourceString ) ;
2003-05-14 02:02:17 +02:00
SetDlgItemTextW ( hDlg , stc12 , StatusMsg ) ;
2002-04-11 19:32:49 +02:00
/* set all other printer info texts */
2003-05-14 02:02:17 +02:00
SetDlgItemTextW ( hDlg , stc11 , pi - > pDriverName ) ;
2002-04-11 19:32:49 +02:00
if ( pi - > pLocation ! = NULL & & pi - > pLocation [ 0 ] ! = ' \0 ' )
2003-05-14 02:02:17 +02:00
SetDlgItemTextW ( hDlg , stc14 , pi - > pLocation ) ;
2002-04-11 19:32:49 +02:00
else
2003-05-14 02:02:17 +02:00
SetDlgItemTextW ( hDlg , stc14 , pi - > pPortName ) ;
SetDlgItemTextW ( hDlg , stc13 , pi - > pComment ? pi - > pComment : emptyW ) ;
1999-02-28 21:05:11 +01:00
}
2000-06-02 21:36:53 +02:00
2000-05-27 00:26:06 +02:00
/*******************************************************************
*
* PRINTDLG_ChangePrinter
*
1999-11-13 21:49:58 +01:00
*/
2003-08-02 02:41:41 +02:00
BOOL PRINTDLG_ChangePrinterA ( HWND hDlg , char * name ,
2000-05-27 00:26:06 +02:00
PRINT_PTRA * PrintStructures )
1999-11-13 21:49:58 +01:00
{
2004-01-09 06:10:35 +01:00
LPPRINTDLGA lppd = PrintStructures - > lpPrintDlg ;
2000-05-27 00:26:06 +02:00
LPDEVMODEA lpdm = NULL ;
LONG dmSize ;
DWORD needed ;
HANDLE hprn ;
2004-12-23 18:06:43 +01:00
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpPrinterInfo ) ;
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpDriverInfo ) ;
2000-05-27 00:26:06 +02:00
if ( ! OpenPrinterA ( name , & hprn , NULL ) ) {
ERR ( " Can't open printer %s \n " , name ) ;
return FALSE ;
}
GetPrinterA ( hprn , 2 , NULL , 0 , & needed ) ;
PrintStructures - > lpPrinterInfo = HeapAlloc ( GetProcessHeap ( ) , 0 , needed ) ;
GetPrinterA ( hprn , 2 , ( LPBYTE ) PrintStructures - > lpPrinterInfo , needed ,
& needed ) ;
2001-05-02 03:10:43 +02:00
GetPrinterDriverA ( hprn , NULL , 3 , NULL , 0 , & needed ) ;
PrintStructures - > lpDriverInfo = HeapAlloc ( GetProcessHeap ( ) , 0 , needed ) ;
if ( ! GetPrinterDriverA ( hprn , NULL , 3 , ( LPBYTE ) PrintStructures - > lpDriverInfo ,
needed , & needed ) ) {
ERR ( " GetPrinterDriverA failed for %s, fix your config! \n " , PrintStructures - > lpPrinterInfo - > pPrinterName ) ;
return FALSE ;
}
2000-05-27 00:26:06 +02:00
ClosePrinter ( hprn ) ;
1999-11-13 21:49:58 +01:00
2002-04-11 19:32:49 +02:00
PRINTDLG_UpdatePrinterInfoTextsA ( hDlg , PrintStructures - > lpPrinterInfo ) ;
1999-11-13 21:49:58 +01:00
2004-12-23 18:06:43 +01:00
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpDevMode ) ;
PrintStructures - > lpDevMode = NULL ;
1999-11-13 21:49:58 +01:00
2000-05-27 00:26:06 +02:00
dmSize = DocumentPropertiesA ( 0 , 0 , name , NULL , NULL , 0 ) ;
if ( dmSize = = - 1 ) {
ERR ( " DocumentProperties fails on %s \n " , debugstr_a ( name ) ) ;
return FALSE ;
1999-08-07 14:34:54 +02:00
}
2000-05-27 00:26:06 +02:00
PrintStructures - > lpDevMode = HeapAlloc ( GetProcessHeap ( ) , 0 , dmSize ) ;
dmSize = DocumentPropertiesA ( 0 , 0 , name , PrintStructures - > lpDevMode , NULL ,
DM_OUT_BUFFER ) ;
if ( lppd - > hDevMode & & ( lpdm = GlobalLock ( lppd - > hDevMode ) ) & &
2005-09-07 13:31:17 +02:00
! lstrcmpA ( ( LPSTR ) lpdm - > dmDeviceName ,
( LPSTR ) PrintStructures - > lpDevMode - > dmDeviceName ) ) {
2000-05-27 00:26:06 +02:00
/* Supplied devicemode matches current printer so try to use it */
DocumentPropertiesA ( 0 , 0 , name , PrintStructures - > lpDevMode , lpdm ,
DM_OUT_BUFFER | DM_IN_BUFFER ) ;
1999-02-28 21:05:11 +01:00
}
2000-05-27 00:26:06 +02:00
if ( lpdm )
GlobalUnlock ( lppd - > hDevMode ) ;
lpdm = PrintStructures - > lpDevMode ; /* use this as a shortcut */
if ( ! ( lppd - > Flags & PD_PRINTSETUP ) ) {
/* Print range (All/Range/Selection) */
SetDlgItemInt ( hDlg , edt1 , lppd - > nFromPage , FALSE ) ;
SetDlgItemInt ( hDlg , edt2 , lppd - > nToPage , FALSE ) ;
CheckRadioButton ( hDlg , rad1 , rad3 , rad1 ) ; /* default */
if ( lppd - > Flags & PD_NOSELECTION )
EnableWindow ( GetDlgItem ( hDlg , rad2 ) , FALSE ) ;
else
if ( lppd - > Flags & PD_SELECTION )
CheckRadioButton ( hDlg , rad1 , rad3 , rad2 ) ;
if ( lppd - > Flags & PD_NOPAGENUMS ) {
EnableWindow ( GetDlgItem ( hDlg , rad3 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , stc2 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , edt1 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , stc3 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , edt2 ) , FALSE ) ;
} else {
if ( lppd - > Flags & PD_PAGENUMS )
CheckRadioButton ( hDlg , rad1 , rad3 , rad3 ) ;
}
2002-06-01 01:06:46 +02:00
/* Collate pages
2000-05-27 00:26:06 +02:00
*
* FIXME : The ico3 is not displayed for some reason . I don ' t know why .
*/
if ( lppd - > Flags & PD_COLLATE ) {
2002-06-01 01:06:46 +02:00
SendDlgItemMessageA ( hDlg , ico3 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
2000-05-27 00:26:06 +02:00
( LPARAM ) PrintStructures - > hCollateIcon ) ;
CheckDlgButton ( hDlg , chx2 , 1 ) ;
} else {
2002-06-01 01:06:46 +02:00
SendDlgItemMessageA ( hDlg , ico3 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
2000-05-27 00:26:06 +02:00
( LPARAM ) PrintStructures - > hNoCollateIcon ) ;
CheckDlgButton ( hDlg , chx2 , 0 ) ;
}
1999-08-07 14:34:54 +02:00
2000-05-27 00:26:06 +02:00
if ( lppd - > Flags & PD_USEDEVMODECOPIESANDCOLLATE ) {
/* if printer doesn't support it: no Collate */
if ( ! ( lpdm - > dmFields & DM_COLLATE ) ) {
2002-06-01 01:06:46 +02:00
EnableWindow ( GetDlgItem ( hDlg , chx2 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , ico3 ) , FALSE ) ;
2000-05-27 00:26:06 +02:00
}
}
1999-08-07 14:34:54 +02:00
2000-05-27 00:26:06 +02:00
/* nCopies */
2001-02-12 19:09:34 +01:00
{
INT copies ;
if ( lppd - > hDevMode = = 0 )
copies = lppd - > nCopies ;
else
copies = lpdm - > dmCopies ;
if ( copies = = 0 ) copies = 1 ;
else if ( copies < 0 ) copies = MAX_COPIES ;
SetDlgItemInt ( hDlg , edt3 , copies , FALSE ) ;
}
2000-05-27 00:26:06 +02:00
if ( lppd - > Flags & PD_USEDEVMODECOPIESANDCOLLATE ) {
/* if printer doesn't support it: no nCopies */
if ( ! ( lpdm - > dmFields & DM_COPIES ) ) {
2002-06-01 01:06:46 +02:00
EnableWindow ( GetDlgItem ( hDlg , edt3 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , stc5 ) , FALSE ) ;
1999-08-07 14:34:54 +02:00
}
2000-05-27 00:26:06 +02:00
}
1999-08-07 14:34:54 +02:00
2000-05-27 00:26:06 +02:00
/* print to file */
CheckDlgButton ( hDlg , chx1 , ( lppd - > Flags & PD_PRINTTOFILE ) ? 1 : 0 ) ;
if ( lppd - > Flags & PD_DISABLEPRINTTOFILE )
2002-06-01 01:06:46 +02:00
EnableWindow ( GetDlgItem ( hDlg , chx1 ) , FALSE ) ;
2000-05-27 00:26:06 +02:00
if ( lppd - > Flags & PD_HIDEPRINTTOFILE )
ShowWindow ( GetDlgItem ( hDlg , chx1 ) , SW_HIDE ) ;
} else { /* PD_PRINTSETUP */
2001-02-12 19:09:34 +01:00
BOOL bPortrait = ( lpdm - > u1 . s1 . dmOrientation = = DMORIENT_PORTRAIT ) ;
2002-04-11 19:32:49 +02:00
PRINTDLG_SetUpPaperComboBoxA ( hDlg , cmb2 ,
PrintStructures - > lpPrinterInfo - > pPrinterName ,
PrintStructures - > lpPrinterInfo - > pPortName ,
lpdm ) ;
PRINTDLG_SetUpPaperComboBoxA ( hDlg , cmb3 ,
PrintStructures - > lpPrinterInfo - > pPrinterName ,
PrintStructures - > lpPrinterInfo - > pPortName ,
lpdm ) ;
CheckRadioButton ( hDlg , rad1 , rad2 , bPortrait ? rad1 : rad2 ) ;
SendDlgItemMessageA ( hDlg , ico1 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
( LPARAM ) ( bPortrait ? PrintStructures - > hPortraitIcon :
PrintStructures - > hLandscapeIcon ) ) ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
}
/* help button */
if ( ( lppd - > Flags & PD_SHOWHELP ) = = 0 ) {
/* hide if PD_SHOWHELP not specified */
2002-06-01 01:06:46 +02:00
ShowWindow ( GetDlgItem ( hDlg , pshHelp ) , SW_HIDE ) ;
2002-04-11 19:32:49 +02:00
}
return TRUE ;
}
static BOOL PRINTDLG_ChangePrinterW ( HWND hDlg , WCHAR * name ,
PRINT_PTRW * PrintStructures )
{
2004-01-09 06:10:35 +01:00
LPPRINTDLGW lppd = PrintStructures - > lpPrintDlg ;
2002-04-11 19:32:49 +02:00
LPDEVMODEW lpdm = NULL ;
LONG dmSize ;
DWORD needed ;
HANDLE hprn ;
2004-12-23 18:06:43 +01:00
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpPrinterInfo ) ;
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpDriverInfo ) ;
2002-04-11 19:32:49 +02:00
if ( ! OpenPrinterW ( name , & hprn , NULL ) ) {
ERR ( " Can't open printer %s \n " , debugstr_w ( name ) ) ;
return FALSE ;
}
GetPrinterW ( hprn , 2 , NULL , 0 , & needed ) ;
PrintStructures - > lpPrinterInfo = HeapAlloc ( GetProcessHeap ( ) , 0 , sizeof ( WCHAR ) * needed ) ;
GetPrinterW ( hprn , 2 , ( LPBYTE ) PrintStructures - > lpPrinterInfo , needed ,
& needed ) ;
GetPrinterDriverW ( hprn , NULL , 3 , NULL , 0 , & needed ) ;
PrintStructures - > lpDriverInfo = HeapAlloc ( GetProcessHeap ( ) , 0 , sizeof ( WCHAR ) * needed ) ;
if ( ! GetPrinterDriverW ( hprn , NULL , 3 , ( LPBYTE ) PrintStructures - > lpDriverInfo ,
needed , & needed ) ) {
ERR ( " GetPrinterDriverA failed for %s, fix your config! \n " , debugstr_w ( PrintStructures - > lpPrinterInfo - > pPrinterName ) ) ;
return FALSE ;
}
ClosePrinter ( hprn ) ;
PRINTDLG_UpdatePrinterInfoTextsW ( hDlg , PrintStructures - > lpPrinterInfo ) ;
2004-12-23 18:06:43 +01:00
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpDevMode ) ;
PrintStructures - > lpDevMode = NULL ;
2002-04-11 19:32:49 +02:00
dmSize = DocumentPropertiesW ( 0 , 0 , name , NULL , NULL , 0 ) ;
if ( dmSize = = - 1 ) {
ERR ( " DocumentProperties fails on %s \n " , debugstr_w ( name ) ) ;
return FALSE ;
}
PrintStructures - > lpDevMode = HeapAlloc ( GetProcessHeap ( ) , 0 , dmSize ) ;
dmSize = DocumentPropertiesW ( 0 , 0 , name , PrintStructures - > lpDevMode , NULL ,
DM_OUT_BUFFER ) ;
if ( lppd - > hDevMode & & ( lpdm = GlobalLock ( lppd - > hDevMode ) ) & &
! lstrcmpW ( lpdm - > dmDeviceName ,
PrintStructures - > lpDevMode - > dmDeviceName ) ) {
/* Supplied devicemode matches current printer so try to use it */
DocumentPropertiesW ( 0 , 0 , name , PrintStructures - > lpDevMode , lpdm ,
DM_OUT_BUFFER | DM_IN_BUFFER ) ;
}
if ( lpdm )
GlobalUnlock ( lppd - > hDevMode ) ;
lpdm = PrintStructures - > lpDevMode ; /* use this as a shortcut */
if ( ! ( lppd - > Flags & PD_PRINTSETUP ) ) {
/* Print range (All/Range/Selection) */
SetDlgItemInt ( hDlg , edt1 , lppd - > nFromPage , FALSE ) ;
SetDlgItemInt ( hDlg , edt2 , lppd - > nToPage , FALSE ) ;
CheckRadioButton ( hDlg , rad1 , rad3 , rad1 ) ; /* default */
if ( lppd - > Flags & PD_NOSELECTION )
EnableWindow ( GetDlgItem ( hDlg , rad2 ) , FALSE ) ;
else
if ( lppd - > Flags & PD_SELECTION )
CheckRadioButton ( hDlg , rad1 , rad3 , rad2 ) ;
if ( lppd - > Flags & PD_NOPAGENUMS ) {
EnableWindow ( GetDlgItem ( hDlg , rad3 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , stc2 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , edt1 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , stc3 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , edt2 ) , FALSE ) ;
} else {
if ( lppd - > Flags & PD_PAGENUMS )
CheckRadioButton ( hDlg , rad1 , rad3 , rad3 ) ;
}
2002-06-01 01:06:46 +02:00
/* Collate pages
2002-04-11 19:32:49 +02:00
*
* FIXME : The ico3 is not displayed for some reason . I don ' t know why .
*/
if ( lppd - > Flags & PD_COLLATE ) {
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , ico3 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
2002-04-11 19:32:49 +02:00
( LPARAM ) PrintStructures - > hCollateIcon ) ;
CheckDlgButton ( hDlg , chx2 , 1 ) ;
} else {
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , ico3 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
2002-04-11 19:32:49 +02:00
( LPARAM ) PrintStructures - > hNoCollateIcon ) ;
CheckDlgButton ( hDlg , chx2 , 0 ) ;
}
if ( lppd - > Flags & PD_USEDEVMODECOPIESANDCOLLATE ) {
/* if printer doesn't support it: no Collate */
if ( ! ( lpdm - > dmFields & DM_COLLATE ) ) {
2002-06-01 01:06:46 +02:00
EnableWindow ( GetDlgItem ( hDlg , chx2 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , ico3 ) , FALSE ) ;
2002-04-11 19:32:49 +02:00
}
}
/* nCopies */
{
INT copies ;
if ( lppd - > hDevMode = = 0 )
copies = lppd - > nCopies ;
else
copies = lpdm - > dmCopies ;
if ( copies = = 0 ) copies = 1 ;
else if ( copies < 0 ) copies = MAX_COPIES ;
SetDlgItemInt ( hDlg , edt3 , copies , FALSE ) ;
}
if ( lppd - > Flags & PD_USEDEVMODECOPIESANDCOLLATE ) {
/* if printer doesn't support it: no nCopies */
if ( ! ( lpdm - > dmFields & DM_COPIES ) ) {
2002-06-01 01:06:46 +02:00
EnableWindow ( GetDlgItem ( hDlg , edt3 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , stc5 ) , FALSE ) ;
2002-04-11 19:32:49 +02:00
}
}
/* print to file */
CheckDlgButton ( hDlg , chx1 , ( lppd - > Flags & PD_PRINTTOFILE ) ? 1 : 0 ) ;
if ( lppd - > Flags & PD_DISABLEPRINTTOFILE )
2002-06-01 01:06:46 +02:00
EnableWindow ( GetDlgItem ( hDlg , chx1 ) , FALSE ) ;
2002-04-11 19:32:49 +02:00
if ( lppd - > Flags & PD_HIDEPRINTTOFILE )
ShowWindow ( GetDlgItem ( hDlg , chx1 ) , SW_HIDE ) ;
} else { /* PD_PRINTSETUP */
BOOL bPortrait = ( lpdm - > u1 . s1 . dmOrientation = = DMORIENT_PORTRAIT ) ;
PRINTDLG_SetUpPaperComboBoxW ( hDlg , cmb2 ,
2000-05-27 00:26:06 +02:00
PrintStructures - > lpPrinterInfo - > pPrinterName ,
PrintStructures - > lpPrinterInfo - > pPortName ,
lpdm ) ;
2002-04-11 19:32:49 +02:00
PRINTDLG_SetUpPaperComboBoxW ( hDlg , cmb3 ,
2000-05-27 00:26:06 +02:00
PrintStructures - > lpPrinterInfo - > pPrinterName ,
PrintStructures - > lpPrinterInfo - > pPortName ,
lpdm ) ;
2001-02-12 19:09:34 +01:00
CheckRadioButton ( hDlg , rad1 , rad2 , bPortrait ? rad1 : rad2 ) ;
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , ico1 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
2001-02-12 19:09:34 +01:00
( LPARAM ) ( bPortrait ? PrintStructures - > hPortraitIcon :
PrintStructures - > hLandscapeIcon ) ) ;
2002-06-01 01:06:46 +02:00
2000-05-11 02:09:29 +02:00
}
2000-05-27 00:26:06 +02:00
/* help button */
if ( ( lppd - > Flags & PD_SHOWHELP ) = = 0 ) {
/* hide if PD_SHOWHELP not specified */
2002-06-01 01:06:46 +02:00
ShowWindow ( GetDlgItem ( hDlg , pshHelp ) , SW_HIDE ) ;
2000-05-27 00:26:06 +02:00
}
return TRUE ;
1999-05-02 13:34:26 +02:00
}
1999-02-28 21:05:11 +01:00
2005-11-03 13:12:18 +01:00
/***********************************************************************
* check_printer_setup [ internal ]
*/
static LRESULT check_printer_setup ( HWND hDlg )
{
DWORD needed , num ;
WCHAR resourcestr [ 256 ] , resultstr [ 256 ] ;
int res ;
EnumPrintersW ( PRINTER_ENUM_LOCAL , NULL , 2 , NULL , 0 , & needed , & num ) ;
if ( needed = = 0 )
{
EnumPrintersW ( PRINTER_ENUM_CONNECTIONS , NULL , 2 , NULL , 0 , & needed , & num ) ;
}
if ( needed > 0 )
return TRUE ;
else
{
LoadStringW ( COMDLG32_hInstance , PD32_NO_DEVICES , resultstr , 255 ) ;
LoadStringW ( COMDLG32_hInstance , PD32_PRINT_TITLE , resourcestr , 255 ) ;
res = MessageBoxW ( hDlg , resultstr , resourcestr , MB_OK | MB_ICONWARNING ) ;
return FALSE ;
}
}
1999-11-13 21:49:58 +01:00
/***********************************************************************
2000-05-27 00:26:06 +02:00
* PRINTDLG_WMInitDialog [ internal ]
1999-11-13 21:49:58 +01:00
*/
2000-05-27 00:26:06 +02:00
static LRESULT PRINTDLG_WMInitDialog ( HWND hDlg , WPARAM wParam ,
PRINT_PTRA * PrintStructures )
1999-11-13 21:49:58 +01:00
{
2004-01-09 06:10:35 +01:00
LPPRINTDLGA lppd = PrintStructures - > lpPrintDlg ;
2000-05-27 00:26:06 +02:00
DEVNAMES * pdn ;
DEVMODEA * pdm ;
char * name = NULL ;
UINT comboID = ( lppd - > Flags & PD_PRINTSETUP ) ? cmb1 : cmb4 ;
1999-11-13 21:49:58 +01:00
2000-05-27 00:26:06 +02:00
/* load Collate ICONs */
2001-10-08 22:40:09 +02:00
/* We load these with LoadImage because they are not a standard
2001-02-12 04:38:14 +01:00
size and we don ' t want them rescaled */
2000-05-27 00:26:06 +02:00
PrintStructures - > hCollateIcon =
2001-02-12 04:38:14 +01:00
LoadImageA ( COMDLG32_hInstance , " PD32_COLLATE " , IMAGE_ICON , 0 , 0 , 0 ) ;
2002-06-01 01:06:46 +02:00
PrintStructures - > hNoCollateIcon =
2001-02-12 04:38:14 +01:00
LoadImageA ( COMDLG32_hInstance , " PD32_NOCOLLATE " , IMAGE_ICON , 0 , 0 , 0 ) ;
2001-02-12 19:09:34 +01:00
/* These can be done with LoadIcon */
PrintStructures - > hPortraitIcon =
LoadIconA ( COMDLG32_hInstance , " PD32_PORTRAIT " ) ;
PrintStructures - > hLandscapeIcon =
LoadIconA ( COMDLG32_hInstance , " PD32_LANDSCAPE " ) ;
2004-07-19 21:35:28 +02:00
/* display the collate/no_collate icon */
SendDlgItemMessageA ( hDlg , ico3 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
( LPARAM ) PrintStructures - > hNoCollateIcon ) ;
2000-05-27 00:26:06 +02:00
if ( PrintStructures - > hCollateIcon = = 0 | |
2001-02-12 19:09:34 +01:00
PrintStructures - > hNoCollateIcon = = 0 | |
PrintStructures - > hPortraitIcon = = 0 | |
PrintStructures - > hLandscapeIcon = = 0 ) {
2000-05-27 00:26:06 +02:00
ERR ( " no icon in resourcefile \n " ) ;
COMDLG32_SetCommDlgExtendedError ( CDERR_LOADRESFAILURE ) ;
EndDialog ( hDlg , FALSE ) ;
}
1999-11-13 21:49:58 +01:00
2000-05-27 00:26:06 +02:00
/*
* if lppd - > Flags PD_SHOWHELP is specified , a HELPMESGSTRING message
* must be registered and the Help button must be shown .
*/
if ( lppd - > Flags & PD_SHOWHELP ) {
2002-06-01 01:06:46 +02:00
if ( ( PrintStructures - > HelpMessageID =
2001-01-22 03:13:58 +01:00
RegisterWindowMessageA ( HELPMSGSTRINGA ) ) = = 0 ) {
2000-05-27 00:26:06 +02:00
COMDLG32_SetCommDlgExtendedError ( CDERR_REGISTERMSGFAIL ) ;
return FALSE ;
}
} else
PrintStructures - > HelpMessageID = 0 ;
1999-11-13 21:49:58 +01:00
2001-02-12 19:09:34 +01:00
if ( ! ( lppd - > Flags & PD_PRINTSETUP ) ) {
PrintStructures - > hwndUpDown =
CreateUpDownControl ( WS_CHILD | WS_VISIBLE | WS_BORDER |
UDS_NOTHOUSANDS | UDS_ARROWKEYS |
UDS_ALIGNRIGHT | UDS_SETBUDDYINT , 0 , 0 , 0 , 0 ,
hDlg , UPDOWN_ID , COMDLG32_hInstance ,
GetDlgItem ( hDlg , edt3 ) , MAX_COPIES , 1 , 1 ) ;
}
2000-05-27 00:26:06 +02:00
/* FIXME: I allow more freedom than either Win95 or WinNT,
* which do not agree to what errors should be thrown or not
* in case nToPage or nFromPage is out - of - range .
*/
if ( lppd - > nMaxPage < lppd - > nMinPage )
lppd - > nMaxPage = lppd - > nMinPage ;
2002-06-01 01:06:46 +02:00
if ( lppd - > nMinPage = = lppd - > nMaxPage )
lppd - > Flags | = PD_NOPAGENUMS ;
2000-05-27 00:26:06 +02:00
if ( lppd - > nToPage < lppd - > nMinPage )
lppd - > nToPage = lppd - > nMinPage ;
if ( lppd - > nToPage > lppd - > nMaxPage )
lppd - > nToPage = lppd - > nMaxPage ;
if ( lppd - > nFromPage < lppd - > nMinPage )
lppd - > nFromPage = lppd - > nMinPage ;
if ( lppd - > nFromPage > lppd - > nMaxPage )
lppd - > nFromPage = lppd - > nMaxPage ;
1999-11-13 21:49:58 +01:00
2001-01-02 23:26:09 +01:00
/* if we have the combo box, fill it */
if ( GetDlgItem ( hDlg , comboID ) ) {
2002-06-01 01:06:46 +02:00
/* Fill Combobox
2001-01-02 23:26:09 +01:00
*/
pdn = GlobalLock ( lppd - > hDevNames ) ;
pdm = GlobalLock ( lppd - > hDevMode ) ;
if ( pdn )
name = ( char * ) pdn + pdn - > wDeviceOffset ;
else if ( pdm )
2005-07-05 16:11:04 +02:00
name = ( char * ) pdm - > dmDeviceName ;
2002-04-11 19:32:49 +02:00
PRINTDLG_SetUpPrinterListComboA ( hDlg , comboID , name ) ;
2001-01-02 23:26:09 +01:00
if ( pdm ) GlobalUnlock ( lppd - > hDevMode ) ;
if ( pdn ) GlobalUnlock ( lppd - > hDevNames ) ;
/* Now find selected printer and update rest of dlg */
name = HeapAlloc ( GetProcessHeap ( ) , 0 , 256 ) ;
if ( GetDlgItemTextA ( hDlg , comboID , name , 255 ) )
2002-04-11 19:32:49 +02:00
PRINTDLG_ChangePrinterA ( hDlg , name , PrintStructures ) ;
2001-01-02 23:26:09 +01:00
HeapFree ( GetProcessHeap ( ) , 0 , name ) ;
} else {
/* else use default printer */
char name [ 200 ] ;
2004-01-02 02:49:31 +01:00
DWORD dwBufLen = sizeof ( name ) ;
BOOL ret = GetDefaultPrinterA ( name , & dwBufLen ) ;
2002-04-11 19:32:49 +02:00
if ( ret )
PRINTDLG_ChangePrinterA ( hDlg , name , PrintStructures ) ;
else
FIXME ( " No default printer found, expect problems! \n " ) ;
}
return TRUE ;
}
static LRESULT PRINTDLG_WMInitDialogW ( HWND hDlg , WPARAM wParam ,
PRINT_PTRW * PrintStructures )
{
2005-10-06 13:38:45 +02:00
static const WCHAR PD32_COLLATE [ ] = { ' P ' , ' D ' , ' 3 ' , ' 2 ' , ' _ ' , ' C ' , ' O ' , ' L ' , ' L ' , ' A ' , ' T ' , ' E ' , 0 } ;
static const WCHAR PD32_NOCOLLATE [ ] = { ' P ' , ' D ' , ' 3 ' , ' 2 ' , ' _ ' , ' N ' , ' O ' , ' C ' , ' O ' , ' L ' , ' L ' , ' A ' , ' T ' , ' E ' , 0 } ;
static const WCHAR PD32_PORTRAIT [ ] = { ' P ' , ' D ' , ' 3 ' , ' 2 ' , ' _ ' , ' P ' , ' O ' , ' R ' , ' T ' , ' R ' , ' A ' , ' I ' , ' T ' , 0 } ;
static const WCHAR PD32_LANDSCAPE [ ] = { ' P ' , ' D ' , ' 3 ' , ' 2 ' , ' _ ' , ' L ' , ' A ' , ' N ' , ' D ' , ' S ' , ' C ' , ' A ' , ' P ' , ' E ' , 0 } ;
2004-01-09 06:10:35 +01:00
LPPRINTDLGW lppd = PrintStructures - > lpPrintDlg ;
2002-04-11 19:32:49 +02:00
DEVNAMES * pdn ;
DEVMODEW * pdm ;
WCHAR * name = NULL ;
UINT comboID = ( lppd - > Flags & PD_PRINTSETUP ) ? cmb1 : cmb4 ;
/* load Collate ICONs */
/* We load these with LoadImage because they are not a standard
size and we don ' t want them rescaled */
PrintStructures - > hCollateIcon =
2004-09-22 21:11:05 +02:00
LoadImageW ( COMDLG32_hInstance , PD32_COLLATE , IMAGE_ICON , 0 , 0 , 0 ) ;
2002-06-01 01:06:46 +02:00
PrintStructures - > hNoCollateIcon =
2004-09-22 21:11:05 +02:00
LoadImageW ( COMDLG32_hInstance , PD32_NOCOLLATE , IMAGE_ICON , 0 , 0 , 0 ) ;
2002-04-11 19:32:49 +02:00
/* These can be done with LoadIcon */
PrintStructures - > hPortraitIcon =
2004-09-22 21:11:05 +02:00
LoadIconW ( COMDLG32_hInstance , PD32_PORTRAIT ) ;
2002-04-11 19:32:49 +02:00
PrintStructures - > hLandscapeIcon =
2004-09-22 21:11:05 +02:00
LoadIconW ( COMDLG32_hInstance , PD32_LANDSCAPE ) ;
2002-04-11 19:32:49 +02:00
2004-07-19 21:35:28 +02:00
/* display the collate/no_collate icon */
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , ico3 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
2004-07-19 21:35:28 +02:00
( LPARAM ) PrintStructures - > hNoCollateIcon ) ;
2002-04-11 19:32:49 +02:00
if ( PrintStructures - > hCollateIcon = = 0 | |
PrintStructures - > hNoCollateIcon = = 0 | |
PrintStructures - > hPortraitIcon = = 0 | |
PrintStructures - > hLandscapeIcon = = 0 ) {
ERR ( " no icon in resourcefile \n " ) ;
COMDLG32_SetCommDlgExtendedError ( CDERR_LOADRESFAILURE ) ;
EndDialog ( hDlg , FALSE ) ;
}
/*
* if lppd - > Flags PD_SHOWHELP is specified , a HELPMESGSTRING message
* must be registered and the Help button must be shown .
*/
if ( lppd - > Flags & PD_SHOWHELP ) {
2002-06-01 01:06:46 +02:00
if ( ( PrintStructures - > HelpMessageID =
2004-09-22 21:11:05 +02:00
RegisterWindowMessageW ( HELPMSGSTRINGW ) ) = = 0 ) {
2002-04-11 19:32:49 +02:00
COMDLG32_SetCommDlgExtendedError ( CDERR_REGISTERMSGFAIL ) ;
return FALSE ;
}
} else
PrintStructures - > HelpMessageID = 0 ;
if ( ! ( lppd - > Flags & PD_PRINTSETUP ) ) {
PrintStructures - > hwndUpDown =
CreateUpDownControl ( WS_CHILD | WS_VISIBLE | WS_BORDER |
UDS_NOTHOUSANDS | UDS_ARROWKEYS |
UDS_ALIGNRIGHT | UDS_SETBUDDYINT , 0 , 0 , 0 , 0 ,
hDlg , UPDOWN_ID , COMDLG32_hInstance ,
GetDlgItem ( hDlg , edt3 ) , MAX_COPIES , 1 , 1 ) ;
}
/* FIXME: I allow more freedom than either Win95 or WinNT,
* which do not agree to what errors should be thrown or not
* in case nToPage or nFromPage is out - of - range .
*/
if ( lppd - > nMaxPage < lppd - > nMinPage )
lppd - > nMaxPage = lppd - > nMinPage ;
2002-06-01 01:06:46 +02:00
if ( lppd - > nMinPage = = lppd - > nMaxPage )
lppd - > Flags | = PD_NOPAGENUMS ;
2002-04-11 19:32:49 +02:00
if ( lppd - > nToPage < lppd - > nMinPage )
lppd - > nToPage = lppd - > nMinPage ;
if ( lppd - > nToPage > lppd - > nMaxPage )
lppd - > nToPage = lppd - > nMaxPage ;
if ( lppd - > nFromPage < lppd - > nMinPage )
lppd - > nFromPage = lppd - > nMinPage ;
if ( lppd - > nFromPage > lppd - > nMaxPage )
lppd - > nFromPage = lppd - > nMaxPage ;
/* if we have the combo box, fill it */
if ( GetDlgItem ( hDlg , comboID ) ) {
2002-06-01 01:06:46 +02:00
/* Fill Combobox
2002-04-11 19:32:49 +02:00
*/
pdn = GlobalLock ( lppd - > hDevNames ) ;
pdm = GlobalLock ( lppd - > hDevMode ) ;
if ( pdn )
name = ( WCHAR * ) pdn + pdn - > wDeviceOffset ;
else if ( pdm )
name = pdm - > dmDeviceName ;
PRINTDLG_SetUpPrinterListComboW ( hDlg , comboID , name ) ;
if ( pdm ) GlobalUnlock ( lppd - > hDevMode ) ;
if ( pdn ) GlobalUnlock ( lppd - > hDevNames ) ;
/* Now find selected printer and update rest of dlg */
/* ansi is ok here */
name = HeapAlloc ( GetProcessHeap ( ) , 0 , 256 * sizeof ( WCHAR ) ) ;
if ( GetDlgItemTextW ( hDlg , comboID , name , 255 ) )
PRINTDLG_ChangePrinterW ( hDlg , name , PrintStructures ) ;
HeapFree ( GetProcessHeap ( ) , 0 , name ) ;
} else {
/* else use default printer */
WCHAR name [ 200 ] ;
2004-01-02 02:49:31 +01:00
DWORD dwBufLen = sizeof ( name ) / sizeof ( WCHAR ) ;
BOOL ret = GetDefaultPrinterW ( name , & dwBufLen ) ;
2001-01-02 23:26:09 +01:00
if ( ret )
2002-04-11 19:32:49 +02:00
PRINTDLG_ChangePrinterW ( hDlg , name , PrintStructures ) ;
2001-01-02 23:26:09 +01:00
else
FIXME ( " No default printer found, expect problems! \n " ) ;
}
return TRUE ;
}
1999-02-28 21:05:11 +01:00
/***********************************************************************
* PRINTDLG_WMCommand [ internal ]
*/
2003-08-02 02:41:41 +02:00
LRESULT PRINTDLG_WMCommandA ( HWND hDlg , WPARAM wParam ,
1999-05-02 13:34:26 +02:00
LPARAM lParam , PRINT_PTRA * PrintStructures )
1999-02-28 21:05:11 +01:00
{
2004-01-09 06:10:35 +01:00
LPPRINTDLGA lppd = PrintStructures - > lpPrintDlg ;
2000-05-27 00:26:06 +02:00
UINT PrinterComboID = ( lppd - > Flags & PD_PRINTSETUP ) ? cmb1 : cmb4 ;
LPDEVMODEA lpdm = PrintStructures - > lpDevMode ;
1999-05-02 13:34:26 +02:00
2000-05-27 00:26:06 +02:00
switch ( LOWORD ( wParam ) ) {
case IDOK :
1999-06-12 17:45:58 +02:00
TRACE ( " OK button was hit \n " ) ;
2004-12-09 15:07:59 +01:00
if ( ! PRINTDLG_UpdatePrintDlgA ( hDlg , PrintStructures ) ) {
2001-01-02 23:26:09 +01:00
FIXME ( " Update printdlg was not successful! \n " ) ;
2000-05-27 00:26:06 +02:00
return ( FALSE ) ;
2001-01-02 23:26:09 +01:00
}
2000-05-27 00:26:06 +02:00
EndDialog ( hDlg , TRUE ) ;
return ( TRUE ) ;
case IDCANCEL :
1999-06-12 17:45:58 +02:00
TRACE ( " CANCEL button was hit \n " ) ;
1999-02-28 21:05:11 +01:00
EndDialog ( hDlg , FALSE ) ;
2000-05-27 00:26:06 +02:00
return ( FALSE ) ;
1999-05-02 13:34:26 +02:00
case pshHelp :
1999-06-12 17:45:58 +02:00
TRACE ( " HELP button was hit \n " ) ;
2002-06-01 01:06:46 +02:00
SendMessageA ( lppd - > hwndOwner , PrintStructures - > HelpMessageID ,
1999-05-02 13:34:26 +02:00
( WPARAM ) hDlg , ( LPARAM ) lppd ) ;
break ;
2000-05-27 00:26:06 +02:00
1999-07-30 20:10:21 +02:00
case chx2 : /* collate pages checkbox */
if ( IsDlgButtonChecked ( hDlg , chx2 ) = = BST_CHECKED )
2002-06-01 01:06:46 +02:00
SendDlgItemMessageA ( hDlg , ico3 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
1999-07-30 20:10:21 +02:00
( LPARAM ) PrintStructures - > hCollateIcon ) ;
else
2002-06-01 01:06:46 +02:00
SendDlgItemMessageA ( hDlg , ico3 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
1999-07-30 20:10:21 +02:00
( LPARAM ) PrintStructures - > hNoCollateIcon ) ;
2002-06-01 01:06:46 +02:00
break ;
1999-07-30 20:10:21 +02:00
case edt1 : /* from page nr editbox */
case edt2 : /* to page nr editbox */
2000-05-27 00:26:06 +02:00
if ( HIWORD ( wParam ) = = EN_CHANGE ) {
WORD nToPage ;
WORD nFromPage ;
nFromPage = GetDlgItemInt ( hDlg , edt1 , NULL , FALSE ) ;
nToPage = GetDlgItemInt ( hDlg , edt2 , NULL , FALSE ) ;
1999-05-02 13:34:26 +02:00
if ( nFromPage ! = lppd - > nFromPage | | nToPage ! = lppd - > nToPage )
2000-05-27 00:26:06 +02:00
CheckRadioButton ( hDlg , rad1 , rad3 , rad3 ) ;
}
1999-05-02 13:34:26 +02:00
break ;
2001-02-12 19:09:34 +01:00
case edt3 :
if ( HIWORD ( wParam ) = = EN_CHANGE ) {
INT copies = GetDlgItemInt ( hDlg , edt3 , NULL , FALSE ) ;
if ( copies < = 1 )
EnableWindow ( GetDlgItem ( hDlg , chx2 ) , FALSE ) ;
else
EnableWindow ( GetDlgItem ( hDlg , chx2 ) , TRUE ) ;
}
break ;
2003-08-02 02:41:41 +02:00
#if 0
2001-07-14 02:47:20 +02:00
case psh1 : /* Print Setup */
{
PRINTDLG16 pdlg ;
2002-06-01 01:06:46 +02:00
2001-07-14 02:47:20 +02:00
if ( ! PrintStructures - > dlg . lpPrintDlg16 ) {
FIXME ( " The 32bit print dialog does not have this button!? \n " ) ;
break ;
}
memcpy ( & pdlg , PrintStructures - > dlg . lpPrintDlg16 , sizeof ( pdlg ) ) ;
pdlg . Flags | = PD_PRINTSETUP ;
2002-09-06 22:40:42 +02:00
pdlg . hwndOwner = HWND_16 ( hDlg ) ;
2001-07-14 02:47:20 +02:00
if ( ! PrintDlg16 ( & pdlg ) )
break ;
}
break ;
2003-08-02 02:41:41 +02:00
# endif
2000-05-27 00:26:06 +02:00
case psh2 : /* Properties button */
{
HANDLE hPrinter ;
2002-04-11 19:32:49 +02:00
char PrinterName [ 256 ] ;
GetDlgItemTextA ( hDlg , PrinterComboID , PrinterName , 255 ) ;
if ( ! OpenPrinterA ( PrinterName , & hPrinter , NULL ) ) {
FIXME ( " Call to OpenPrinter did not succeed! \n " ) ;
break ;
}
2002-06-01 01:06:46 +02:00
DocumentPropertiesA ( hDlg , hPrinter , PrinterName ,
2002-04-11 19:32:49 +02:00
PrintStructures - > lpDevMode ,
PrintStructures - > lpDevMode ,
DM_IN_BUFFER | DM_OUT_BUFFER | DM_IN_PROMPT ) ;
ClosePrinter ( hPrinter ) ;
break ;
}
case rad1 : /* Paperorientation */
if ( lppd - > Flags & PD_PRINTSETUP )
{
lpdm - > u1 . s1 . dmOrientation = DMORIENT_PORTRAIT ;
SendDlgItemMessageA ( hDlg , ico1 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
( LPARAM ) ( PrintStructures - > hPortraitIcon ) ) ;
}
break ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
case rad2 : /* Paperorientation */
if ( lppd - > Flags & PD_PRINTSETUP )
{
lpdm - > u1 . s1 . dmOrientation = DMORIENT_LANDSCAPE ;
SendDlgItemMessageA ( hDlg , ico1 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
( LPARAM ) ( PrintStructures - > hLandscapeIcon ) ) ;
}
break ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
case cmb1 : /* Printer Combobox in PRINT SETUP, quality combobox in PRINT */
2004-08-18 23:00:05 +02:00
if ( PrinterComboID ! = LOWORD ( wParam ) ) {
2002-04-11 19:32:49 +02:00
FIXME ( " No handling for print quality combo box yet. \n " ) ;
break ;
}
/* FALLTHROUGH */
case cmb4 : /* Printer combobox */
if ( HIWORD ( wParam ) = = CBN_SELCHANGE ) {
char PrinterName [ 256 ] ;
GetDlgItemTextA ( hDlg , LOWORD ( wParam ) , PrinterName , 255 ) ;
PRINTDLG_ChangePrinterA ( hDlg , PrinterName , PrintStructures ) ;
}
break ;
case cmb2 : /* Papersize */
{
DWORD Sel = SendDlgItemMessageA ( hDlg , cmb2 , CB_GETCURSEL , 0 , 0 ) ;
if ( Sel ! = CB_ERR )
lpdm - > u1 . s1 . dmPaperSize = SendDlgItemMessageA ( hDlg , cmb2 ,
CB_GETITEMDATA ,
Sel , 0 ) ;
}
break ;
case cmb3 : /* Bin */
{
DWORD Sel = SendDlgItemMessageA ( hDlg , cmb3 , CB_GETCURSEL , 0 , 0 ) ;
if ( Sel ! = CB_ERR )
lpdm - > dmDefaultSource = SendDlgItemMessageA ( hDlg , cmb3 ,
CB_GETITEMDATA , Sel ,
0 ) ;
}
2002-06-01 01:06:46 +02:00
break ;
2002-04-11 19:32:49 +02:00
}
if ( lppd - > Flags & PD_PRINTSETUP ) {
switch ( LOWORD ( wParam ) ) {
case rad1 : /* orientation */
case rad2 :
if ( IsDlgButtonChecked ( hDlg , rad1 ) = = BST_CHECKED ) {
if ( lpdm - > u1 . s1 . dmOrientation ! = DMORIENT_PORTRAIT ) {
lpdm - > u1 . s1 . dmOrientation = DMORIENT_PORTRAIT ;
SendDlgItemMessageA ( hDlg , stc10 , STM_SETIMAGE ,
( WPARAM ) IMAGE_ICON ,
( LPARAM ) PrintStructures - > hPortraitIcon ) ;
SendDlgItemMessageA ( hDlg , ico1 , STM_SETIMAGE ,
( WPARAM ) IMAGE_ICON ,
( LPARAM ) PrintStructures - > hPortraitIcon ) ;
}
} else {
if ( lpdm - > u1 . s1 . dmOrientation ! = DMORIENT_LANDSCAPE ) {
lpdm - > u1 . s1 . dmOrientation = DMORIENT_LANDSCAPE ;
SendDlgItemMessageA ( hDlg , stc10 , STM_SETIMAGE ,
( WPARAM ) IMAGE_ICON ,
( LPARAM ) PrintStructures - > hLandscapeIcon ) ;
SendDlgItemMessageA ( hDlg , ico1 , STM_SETIMAGE ,
( WPARAM ) IMAGE_ICON ,
( LPARAM ) PrintStructures - > hLandscapeIcon ) ;
}
}
break ;
}
}
return FALSE ;
2002-06-01 01:06:46 +02:00
}
2002-04-11 19:32:49 +02:00
2002-06-01 01:06:46 +02:00
static LRESULT PRINTDLG_WMCommandW ( HWND hDlg , WPARAM wParam ,
2002-04-11 19:32:49 +02:00
LPARAM lParam , PRINT_PTRW * PrintStructures )
{
2004-01-09 06:10:35 +01:00
LPPRINTDLGW lppd = PrintStructures - > lpPrintDlg ;
2002-04-11 19:32:49 +02:00
UINT PrinterComboID = ( lppd - > Flags & PD_PRINTSETUP ) ? cmb1 : cmb4 ;
LPDEVMODEW lpdm = PrintStructures - > lpDevMode ;
switch ( LOWORD ( wParam ) ) {
case IDOK :
TRACE ( " OK button was hit \n " ) ;
2004-12-09 15:07:59 +01:00
if ( ! PRINTDLG_UpdatePrintDlgW ( hDlg , PrintStructures ) ) {
2002-04-11 19:32:49 +02:00
FIXME ( " Update printdlg was not successful! \n " ) ;
return ( FALSE ) ;
}
EndDialog ( hDlg , TRUE ) ;
return ( TRUE ) ;
case IDCANCEL :
TRACE ( " CANCEL button was hit \n " ) ;
EndDialog ( hDlg , FALSE ) ;
return ( FALSE ) ;
case pshHelp :
TRACE ( " HELP button was hit \n " ) ;
2002-06-01 01:06:46 +02:00
SendMessageW ( lppd - > hwndOwner , PrintStructures - > HelpMessageID ,
2002-04-11 19:32:49 +02:00
( WPARAM ) hDlg , ( LPARAM ) lppd ) ;
break ;
case chx2 : /* collate pages checkbox */
if ( IsDlgButtonChecked ( hDlg , chx2 ) = = BST_CHECKED )
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , ico3 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
2002-04-11 19:32:49 +02:00
( LPARAM ) PrintStructures - > hCollateIcon ) ;
else
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , ico3 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
2002-04-11 19:32:49 +02:00
( LPARAM ) PrintStructures - > hNoCollateIcon ) ;
2002-06-01 01:06:46 +02:00
break ;
2002-04-11 19:32:49 +02:00
case edt1 : /* from page nr editbox */
case edt2 : /* to page nr editbox */
if ( HIWORD ( wParam ) = = EN_CHANGE ) {
WORD nToPage ;
WORD nFromPage ;
nFromPage = GetDlgItemInt ( hDlg , edt1 , NULL , FALSE ) ;
nToPage = GetDlgItemInt ( hDlg , edt2 , NULL , FALSE ) ;
if ( nFromPage ! = lppd - > nFromPage | | nToPage ! = lppd - > nToPage )
CheckRadioButton ( hDlg , rad1 , rad3 , rad3 ) ;
}
break ;
case edt3 :
if ( HIWORD ( wParam ) = = EN_CHANGE ) {
INT copies = GetDlgItemInt ( hDlg , edt3 , NULL , FALSE ) ;
if ( copies < = 1 )
EnableWindow ( GetDlgItem ( hDlg , chx2 ) , FALSE ) ;
else
2004-07-17 01:43:20 +02:00
EnableWindow ( GetDlgItem ( hDlg , chx2 ) , TRUE ) ;
}
break ;
2002-04-11 19:32:49 +02:00
case psh1 : /* Print Setup */
{
ERR ( " psh1 is called from 16bit code only, we should not get here. \n " ) ;
}
break ;
case psh2 : /* Properties button */
{
HANDLE hPrinter ;
WCHAR PrinterName [ 256 ] ;
2000-05-27 00:26:06 +02:00
2004-07-16 21:14:19 +02:00
if ( ! GetDlgItemTextW ( hDlg , PrinterComboID , PrinterName , 255 ) ) break ;
2002-04-11 19:32:49 +02:00
if ( ! OpenPrinterW ( PrinterName , & hPrinter , NULL ) ) {
2001-01-02 23:26:09 +01:00
FIXME ( " Call to OpenPrinter did not succeed! \n " ) ;
2000-05-27 00:26:06 +02:00
break ;
}
2002-06-01 01:06:46 +02:00
DocumentPropertiesW ( hDlg , hPrinter , PrinterName ,
2000-05-27 00:26:06 +02:00
PrintStructures - > lpDevMode ,
PrintStructures - > lpDevMode ,
DM_IN_BUFFER | DM_OUT_BUFFER | DM_IN_PROMPT ) ;
ClosePrinter ( hPrinter ) ;
1999-05-02 13:34:26 +02:00
break ;
2000-05-27 00:26:06 +02:00
}
1999-08-07 14:34:54 +02:00
2001-02-12 20:42:08 +01:00
case rad1 : /* Paperorientation */
if ( lppd - > Flags & PD_PRINTSETUP )
2001-05-07 22:14:57 +02:00
{
2001-02-12 20:42:08 +01:00
lpdm - > u1 . s1 . dmOrientation = DMORIENT_PORTRAIT ;
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , ico1 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
2001-05-07 22:14:57 +02:00
( LPARAM ) ( PrintStructures - > hPortraitIcon ) ) ;
}
2001-02-12 20:42:08 +01:00
break ;
2002-06-01 01:06:46 +02:00
2001-02-12 20:42:08 +01:00
case rad2 : /* Paperorientation */
if ( lppd - > Flags & PD_PRINTSETUP )
2001-05-07 22:14:57 +02:00
{
2001-02-12 20:42:08 +01:00
lpdm - > u1 . s1 . dmOrientation = DMORIENT_LANDSCAPE ;
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , ico1 , STM_SETIMAGE , ( WPARAM ) IMAGE_ICON ,
2001-05-07 22:14:57 +02:00
( LPARAM ) ( PrintStructures - > hLandscapeIcon ) ) ;
}
2001-02-12 20:42:08 +01:00
break ;
2002-06-01 01:06:46 +02:00
2001-07-14 02:47:20 +02:00
case cmb1 : /* Printer Combobox in PRINT SETUP, quality combobox in PRINT */
2004-08-18 23:00:05 +02:00
if ( PrinterComboID ! = LOWORD ( wParam ) ) {
2001-07-14 02:47:20 +02:00
FIXME ( " No handling for print quality combo box yet. \n " ) ;
break ;
}
/* FALLTHROUGH */
2000-05-27 00:26:06 +02:00
case cmb4 : /* Printer combobox */
if ( HIWORD ( wParam ) = = CBN_SELCHANGE ) {
2002-04-11 19:32:49 +02:00
WCHAR PrinterName [ 256 ] ;
GetDlgItemTextW ( hDlg , LOWORD ( wParam ) , PrinterName , 255 ) ;
PRINTDLG_ChangePrinterW ( hDlg , PrinterName , PrintStructures ) ;
2000-05-27 00:26:06 +02:00
}
break ;
case cmb2 : /* Papersize */
{
2004-09-22 21:11:05 +02:00
DWORD Sel = SendDlgItemMessageW ( hDlg , cmb2 , CB_GETCURSEL , 0 , 0 ) ;
2000-05-27 00:26:06 +02:00
if ( Sel ! = CB_ERR )
2004-09-22 21:11:05 +02:00
lpdm - > u1 . s1 . dmPaperSize = SendDlgItemMessageW ( hDlg , cmb2 ,
2000-05-27 00:26:06 +02:00
CB_GETITEMDATA ,
Sel , 0 ) ;
}
break ;
case cmb3 : /* Bin */
{
2004-09-22 21:11:05 +02:00
DWORD Sel = SendDlgItemMessageW ( hDlg , cmb3 , CB_GETCURSEL , 0 , 0 ) ;
2000-05-27 00:26:06 +02:00
if ( Sel ! = CB_ERR )
2002-04-11 19:32:49 +02:00
lpdm - > dmDefaultSource = SendDlgItemMessageW ( hDlg , cmb3 ,
2000-05-27 00:26:06 +02:00
CB_GETITEMDATA , Sel ,
0 ) ;
}
2002-06-01 01:06:46 +02:00
break ;
1999-08-07 14:34:54 +02:00
}
2001-02-12 19:09:34 +01:00
if ( lppd - > Flags & PD_PRINTSETUP ) {
switch ( LOWORD ( wParam ) ) {
case rad1 : /* orientation */
case rad2 :
if ( IsDlgButtonChecked ( hDlg , rad1 ) = = BST_CHECKED ) {
if ( lpdm - > u1 . s1 . dmOrientation ! = DMORIENT_PORTRAIT ) {
lpdm - > u1 . s1 . dmOrientation = DMORIENT_PORTRAIT ;
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , stc10 , STM_SETIMAGE ,
2001-07-14 02:47:20 +02:00
( WPARAM ) IMAGE_ICON ,
( LPARAM ) PrintStructures - > hPortraitIcon ) ;
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , ico1 , STM_SETIMAGE ,
2001-02-12 19:09:34 +01:00
( WPARAM ) IMAGE_ICON ,
( LPARAM ) PrintStructures - > hPortraitIcon ) ;
}
} else {
if ( lpdm - > u1 . s1 . dmOrientation ! = DMORIENT_LANDSCAPE ) {
lpdm - > u1 . s1 . dmOrientation = DMORIENT_LANDSCAPE ;
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , stc10 , STM_SETIMAGE ,
2001-07-14 02:47:20 +02:00
( WPARAM ) IMAGE_ICON ,
( LPARAM ) PrintStructures - > hLandscapeIcon ) ;
2004-09-22 21:11:05 +02:00
SendDlgItemMessageW ( hDlg , ico1 , STM_SETIMAGE ,
2001-02-12 19:09:34 +01:00
( WPARAM ) IMAGE_ICON ,
( LPARAM ) PrintStructures - > hLandscapeIcon ) ;
}
}
break ;
}
}
1999-02-28 21:05:11 +01:00
return FALSE ;
2002-06-01 01:06:46 +02:00
}
1999-02-28 21:05:11 +01:00
1999-11-13 21:49:58 +01:00
/***********************************************************************
2000-05-27 00:26:06 +02:00
* PrintDlgProcA [ internal ]
1999-11-13 21:49:58 +01:00
*/
2004-11-29 19:00:10 +01:00
static INT_PTR CALLBACK PrintDlgProcA ( HWND hDlg , UINT uMsg , WPARAM wParam ,
LPARAM lParam )
1999-11-13 21:49:58 +01:00
{
2000-05-27 00:26:06 +02:00
PRINT_PTRA * PrintStructures ;
2002-10-31 02:04:39 +01:00
INT_PTR res = FALSE ;
1999-11-13 21:49:58 +01:00
2000-05-27 00:26:06 +02:00
if ( uMsg ! = WM_INITDIALOG ) {
2002-06-13 23:41:08 +02:00
PrintStructures = ( PRINT_PTRA * ) GetPropA ( hDlg , " __WINE_PRINTDLGDATA " ) ;
2000-05-27 00:26:06 +02:00
if ( ! PrintStructures )
return FALSE ;
} else {
PrintStructures = ( PRINT_PTRA * ) lParam ;
2002-11-22 00:55:10 +01:00
SetPropA ( hDlg , " __WINE_PRINTDLGDATA " , PrintStructures ) ;
2005-11-03 13:12:18 +01:00
if ( ! check_printer_setup ( hDlg ) )
{
EndDialog ( hDlg , FALSE ) ;
return FALSE ;
}
2000-05-27 00:26:06 +02:00
res = PRINTDLG_WMInitDialog ( hDlg , wParam , PrintStructures ) ;
2004-01-09 06:10:35 +01:00
if ( PrintStructures - > lpPrintDlg - > Flags & PD_ENABLEPRINTHOOK )
res = PrintStructures - > lpPrintDlg - > lpfnPrintHook (
hDlg , uMsg , wParam , ( LPARAM ) PrintStructures - > lpPrintDlg
2002-06-01 01:06:46 +02:00
) ;
2000-05-27 00:26:06 +02:00
return res ;
1999-11-13 21:49:58 +01:00
}
2002-06-01 01:06:46 +02:00
2004-01-09 06:10:35 +01:00
if ( PrintStructures - > lpPrintDlg - > Flags & PD_ENABLEPRINTHOOK ) {
res = PrintStructures - > lpPrintDlg - > lpfnPrintHook ( hDlg , uMsg , wParam ,
2000-05-27 00:26:06 +02:00
lParam ) ;
if ( res ) return res ;
}
switch ( uMsg ) {
case WM_COMMAND :
2002-04-11 19:32:49 +02:00
return PRINTDLG_WMCommandA ( hDlg , wParam , lParam , PrintStructures ) ;
case WM_DESTROY :
DestroyIcon ( PrintStructures - > hCollateIcon ) ;
DestroyIcon ( PrintStructures - > hNoCollateIcon ) ;
DestroyIcon ( PrintStructures - > hPortraitIcon ) ;
DestroyIcon ( PrintStructures - > hLandscapeIcon ) ;
if ( PrintStructures - > hwndUpDown )
DestroyWindow ( PrintStructures - > hwndUpDown ) ;
return FALSE ;
2002-06-01 01:06:46 +02:00
}
2002-04-11 19:32:49 +02:00
return res ;
}
2004-11-29 19:00:10 +01:00
static INT_PTR CALLBACK PrintDlgProcW ( HWND hDlg , UINT uMsg , WPARAM wParam ,
LPARAM lParam )
2002-04-11 19:32:49 +02:00
{
2003-06-30 04:06:22 +02:00
static const WCHAR propW [ ] = { ' _ ' , ' _ ' , ' W ' , ' I ' , ' N ' , ' E ' , ' _ ' , ' P ' , ' R ' , ' I ' , ' N ' , ' T ' , ' D ' , ' L ' , ' G ' , ' D ' , ' A ' , ' T ' , ' A ' , 0 } ;
2002-04-11 19:32:49 +02:00
PRINT_PTRW * PrintStructures ;
2002-10-31 02:04:39 +01:00
INT_PTR res = FALSE ;
2002-04-11 19:32:49 +02:00
if ( uMsg ! = WM_INITDIALOG ) {
2003-06-30 04:06:22 +02:00
PrintStructures = ( PRINT_PTRW * ) GetPropW ( hDlg , propW ) ;
2002-04-11 19:32:49 +02:00
if ( ! PrintStructures )
return FALSE ;
} else {
PrintStructures = ( PRINT_PTRW * ) lParam ;
2003-06-30 04:06:22 +02:00
SetPropW ( hDlg , propW , PrintStructures ) ;
2005-11-03 13:12:18 +01:00
if ( ! check_printer_setup ( hDlg ) )
{
EndDialog ( hDlg , FALSE ) ;
return FALSE ;
}
2002-04-11 19:32:49 +02:00
res = PRINTDLG_WMInitDialogW ( hDlg , wParam , PrintStructures ) ;
2004-01-09 06:10:35 +01:00
if ( PrintStructures - > lpPrintDlg - > Flags & PD_ENABLEPRINTHOOK )
res = PrintStructures - > lpPrintDlg - > lpfnPrintHook ( hDlg , uMsg , wParam , ( LPARAM ) PrintStructures - > lpPrintDlg ) ;
2002-04-11 19:32:49 +02:00
return res ;
}
2002-06-01 01:06:46 +02:00
2004-01-09 06:10:35 +01:00
if ( PrintStructures - > lpPrintDlg - > Flags & PD_ENABLEPRINTHOOK ) {
res = PrintStructures - > lpPrintDlg - > lpfnPrintHook ( hDlg , uMsg , wParam , lParam ) ;
2002-04-11 19:32:49 +02:00
if ( res ) return res ;
}
switch ( uMsg ) {
case WM_COMMAND :
return PRINTDLG_WMCommandW ( hDlg , wParam , lParam , PrintStructures ) ;
1999-11-13 21:49:58 +01:00
2000-05-27 00:26:06 +02:00
case WM_DESTROY :
DestroyIcon ( PrintStructures - > hCollateIcon ) ;
DestroyIcon ( PrintStructures - > hNoCollateIcon ) ;
2001-02-12 19:09:34 +01:00
DestroyIcon ( PrintStructures - > hPortraitIcon ) ;
DestroyIcon ( PrintStructures - > hLandscapeIcon ) ;
if ( PrintStructures - > hwndUpDown )
DestroyWindow ( PrintStructures - > hwndUpDown ) ;
2000-05-27 00:26:06 +02:00
return FALSE ;
2002-06-01 01:06:46 +02:00
}
2000-05-27 00:26:06 +02:00
return res ;
}
/************************************************************
*
* PRINTDLG_GetDlgTemplate
*
*/
2007-04-06 11:56:15 +02:00
static HGLOBAL PRINTDLG_GetDlgTemplateA ( const PRINTDLGA * lppd )
2000-05-27 00:26:06 +02:00
{
2002-09-17 00:47:05 +02:00
HRSRC hResInfo ;
HGLOBAL hDlgTmpl ;
2000-05-27 00:26:06 +02:00
if ( lppd - > Flags & PD_PRINTSETUP ) {
2001-01-02 23:26:09 +01:00
if ( lppd - > Flags & PD_ENABLESETUPTEMPLATEHANDLE ) {
2000-05-27 00:26:06 +02:00
hDlgTmpl = lppd - > hSetupTemplate ;
2002-06-01 01:06:46 +02:00
} else if ( lppd - > Flags & PD_ENABLESETUPTEMPLATE ) {
2000-05-27 00:26:06 +02:00
hResInfo = FindResourceA ( lppd - > hInstance ,
2003-09-10 05:56:47 +02:00
lppd - > lpSetupTemplateName , ( LPSTR ) RT_DIALOG ) ;
2000-05-27 00:26:06 +02:00
hDlgTmpl = LoadResource ( lppd - > hInstance , hResInfo ) ;
} else {
hResInfo = FindResourceA ( COMDLG32_hInstance , " PRINT32_SETUP " ,
2003-09-10 05:56:47 +02:00
( LPSTR ) RT_DIALOG ) ;
2000-05-27 00:26:06 +02:00
hDlgTmpl = LoadResource ( COMDLG32_hInstance , hResInfo ) ;
}
} else {
2001-01-02 23:26:09 +01:00
if ( lppd - > Flags & PD_ENABLEPRINTTEMPLATEHANDLE ) {
2000-05-27 00:26:06 +02:00
hDlgTmpl = lppd - > hPrintTemplate ;
} else if ( lppd - > Flags & PD_ENABLEPRINTTEMPLATE ) {
hResInfo = FindResourceA ( lppd - > hInstance ,
lppd - > lpPrintTemplateName ,
2003-09-10 05:56:47 +02:00
( LPSTR ) RT_DIALOG ) ;
2000-05-27 00:26:06 +02:00
hDlgTmpl = LoadResource ( lppd - > hInstance , hResInfo ) ;
} else {
hResInfo = FindResourceA ( COMDLG32_hInstance , " PRINT32 " ,
2003-09-10 05:56:47 +02:00
( LPSTR ) RT_DIALOG ) ;
2000-05-27 00:26:06 +02:00
hDlgTmpl = LoadResource ( COMDLG32_hInstance , hResInfo ) ;
}
}
return hDlgTmpl ;
}
1999-02-28 21:05:11 +01:00
2007-04-06 11:56:15 +02:00
static HGLOBAL PRINTDLG_GetDlgTemplateW ( const PRINTDLGW * lppd )
2002-04-11 19:32:49 +02:00
{
2002-09-17 00:47:05 +02:00
HRSRC hResInfo ;
HGLOBAL hDlgTmpl ;
2004-04-19 22:12:14 +02:00
static const WCHAR xpsetup [ ] = { ' P ' , ' R ' , ' I ' , ' N ' , ' T ' , ' 3 ' , ' 2 ' , ' _ ' , ' S ' , ' E ' , ' T ' , ' U ' , ' P ' , 0 } ;
static const WCHAR xprint [ ] = { ' P ' , ' R ' , ' I ' , ' N ' , ' T ' , ' 3 ' , ' 2 ' , 0 } ;
2002-04-11 19:32:49 +02:00
if ( lppd - > Flags & PD_PRINTSETUP ) {
if ( lppd - > Flags & PD_ENABLESETUPTEMPLATEHANDLE ) {
hDlgTmpl = lppd - > hSetupTemplate ;
2002-06-01 01:06:46 +02:00
} else if ( lppd - > Flags & PD_ENABLESETUPTEMPLATE ) {
2002-04-11 19:32:49 +02:00
hResInfo = FindResourceW ( lppd - > hInstance ,
2003-09-10 05:56:47 +02:00
lppd - > lpSetupTemplateName , ( LPWSTR ) RT_DIALOG ) ;
2002-04-11 19:32:49 +02:00
hDlgTmpl = LoadResource ( lppd - > hInstance , hResInfo ) ;
} else {
2003-09-10 05:56:47 +02:00
hResInfo = FindResourceW ( COMDLG32_hInstance , xpsetup , ( LPWSTR ) RT_DIALOG ) ;
2002-04-11 19:32:49 +02:00
hDlgTmpl = LoadResource ( COMDLG32_hInstance , hResInfo ) ;
}
} else {
if ( lppd - > Flags & PD_ENABLEPRINTTEMPLATEHANDLE ) {
hDlgTmpl = lppd - > hPrintTemplate ;
} else if ( lppd - > Flags & PD_ENABLEPRINTTEMPLATE ) {
hResInfo = FindResourceW ( lppd - > hInstance ,
lppd - > lpPrintTemplateName ,
2003-09-10 05:56:47 +02:00
( LPWSTR ) RT_DIALOG ) ;
2002-04-11 19:32:49 +02:00
hDlgTmpl = LoadResource ( lppd - > hInstance , hResInfo ) ;
} else {
2003-09-10 05:56:47 +02:00
hResInfo = FindResourceW ( COMDLG32_hInstance , xprint , ( LPWSTR ) RT_DIALOG ) ;
2002-04-11 19:32:49 +02:00
hDlgTmpl = LoadResource ( COMDLG32_hInstance , hResInfo ) ;
}
}
return hDlgTmpl ;
}
1999-02-28 21:05:11 +01:00
/***********************************************************************
2000-05-27 00:26:06 +02:00
*
* PRINTDLG_CreateDC
*
1999-02-28 21:05:11 +01:00
*/
2002-04-11 19:32:49 +02:00
static BOOL PRINTDLG_CreateDCA ( LPPRINTDLGA lppd )
1999-02-28 21:05:11 +01:00
{
2000-05-27 00:26:06 +02:00
DEVNAMES * pdn = GlobalLock ( lppd - > hDevNames ) ;
DEVMODEA * pdm = GlobalLock ( lppd - > hDevMode ) ;
if ( lppd - > Flags & PD_RETURNDC ) {
lppd - > hDC = CreateDCA ( ( char * ) pdn + pdn - > wDriverOffset ,
( char * ) pdn + pdn - > wDeviceOffset ,
( char * ) pdn + pdn - > wOutputOffset ,
pdm ) ;
} else if ( lppd - > Flags & PD_RETURNIC ) {
lppd - > hDC = CreateICA ( ( char * ) pdn + pdn - > wDriverOffset ,
( char * ) pdn + pdn - > wDeviceOffset ,
( char * ) pdn + pdn - > wOutputOffset ,
pdm ) ;
}
GlobalUnlock ( lppd - > hDevNames ) ;
GlobalUnlock ( lppd - > hDevMode ) ;
return lppd - > hDC ? TRUE : FALSE ;
1999-02-28 21:05:11 +01:00
}
2000-05-27 00:26:06 +02:00
2002-04-11 19:32:49 +02:00
static BOOL PRINTDLG_CreateDCW ( LPPRINTDLGW lppd )
{
DEVNAMES * pdn = GlobalLock ( lppd - > hDevNames ) ;
DEVMODEW * pdm = GlobalLock ( lppd - > hDevMode ) ;
if ( lppd - > Flags & PD_RETURNDC ) {
lppd - > hDC = CreateDCW ( ( WCHAR * ) pdn + pdn - > wDriverOffset ,
( WCHAR * ) pdn + pdn - > wDeviceOffset ,
( WCHAR * ) pdn + pdn - > wOutputOffset ,
pdm ) ;
} else if ( lppd - > Flags & PD_RETURNIC ) {
lppd - > hDC = CreateICW ( ( WCHAR * ) pdn + pdn - > wDriverOffset ,
( WCHAR * ) pdn + pdn - > wDeviceOffset ,
( WCHAR * ) pdn + pdn - > wOutputOffset ,
pdm ) ;
}
GlobalUnlock ( lppd - > hDevNames ) ;
GlobalUnlock ( lppd - > hDevMode ) ;
return lppd - > hDC ? TRUE : FALSE ;
}
2000-05-27 00:26:06 +02:00
/***********************************************************************
2002-04-11 19:32:49 +02:00
* PrintDlgA ( COMDLG32 . @ )
*
* Displays the the PRINT dialog box , which enables the user to specify
* specific properties of the print job .
2005-07-07 20:23:45 +02:00
*
* PARAMS
* lppd [ IO ] ptr to PRINTDLG32 struct
*
2002-04-11 19:32:49 +02:00
* RETURNS
* nonzero if the user pressed the OK button
* zero if the user cancelled the window or an error occurred
2005-07-07 20:23:45 +02:00
*
2002-04-11 19:32:49 +02:00
* BUGS
* PrintDlg :
* * The Collate Icons do not display , even though they are in the code .
* * The Properties Button ( s ) should call DocumentPropertiesA ( ) .
*/
2005-07-07 20:23:45 +02:00
BOOL WINAPI PrintDlgA ( LPPRINTDLGA lppd )
2002-04-11 19:32:49 +02:00
{
BOOL bRet = FALSE ;
2006-12-14 18:13:01 +01:00
LPVOID ptr ;
HINSTANCE hInst ;
2002-04-11 19:32:49 +02:00
2006-12-14 18:13:01 +01:00
if ( ! lppd )
{
COMDLG32_SetCommDlgExtendedError ( CDERR_INITIALIZATION ) ;
return FALSE ;
}
hInst = ( HINSTANCE ) GetWindowLongPtrA ( lppd - > hwndOwner , GWLP_HINSTANCE ) ;
2002-04-11 19:32:49 +02:00
if ( TRACE_ON ( commdlg ) ) {
char flagstr [ 1000 ] = " " ;
2006-11-29 11:04:52 +01:00
const struct pd_flags * pflag = pd_flags ;
2002-04-11 19:32:49 +02:00
for ( ; pflag - > name ; pflag + + ) {
if ( lppd - > Flags & pflag - > flag )
strcat ( flagstr , pflag - > name ) ;
}
2002-11-22 00:55:10 +01:00
TRACE ( " (%p): hwndOwner = %p, hDevMode = %p, hDevNames = %p \n "
2006-10-13 15:04:43 +02:00
" pp. %d-%d, min p %d, max p %d, copies %d, hinst %p \n "
" flags %08x (%s) \n " ,
2002-04-11 19:32:49 +02:00
lppd , lppd - > hwndOwner , lppd - > hDevMode , lppd - > hDevNames ,
lppd - > nFromPage , lppd - > nToPage , lppd - > nMinPage , lppd - > nMaxPage ,
lppd - > nCopies , lppd - > hInstance , lppd - > Flags , flagstr ) ;
}
if ( lppd - > lStructSize ! = sizeof ( PRINTDLGA ) ) {
WARN ( " structure size failure !!! \n " ) ;
COMDLG32_SetCommDlgExtendedError ( CDERR_STRUCTSIZE ) ;
2002-06-01 01:06:46 +02:00
return FALSE ;
2002-04-11 19:32:49 +02:00
}
if ( lppd - > Flags & PD_RETURNDEFAULT ) {
PRINTER_INFO_2A * pbuf ;
DRIVER_INFO_3A * dbuf ;
HANDLE hprn ;
DWORD needed ;
if ( lppd - > hDevMode | | lppd - > hDevNames ) {
WARN ( " hDevMode or hDevNames non-zero for PD_RETURNDEFAULT \n " ) ;
2002-06-01 01:06:46 +02:00
COMDLG32_SetCommDlgExtendedError ( PDERR_RETDEFFAILURE ) ;
2002-04-11 19:32:49 +02:00
return FALSE ;
}
if ( ! PRINTDLG_OpenDefaultPrinter ( & hprn ) ) {
WARN ( " Can't find default printer \n " ) ;
2002-06-01 01:06:46 +02:00
COMDLG32_SetCommDlgExtendedError ( PDERR_NODEFAULTPRN ) ;
2002-04-11 19:32:49 +02:00
return FALSE ;
}
GetPrinterA ( hprn , 2 , NULL , 0 , & needed ) ;
pbuf = HeapAlloc ( GetProcessHeap ( ) , 0 , needed ) ;
GetPrinterA ( hprn , 2 , ( LPBYTE ) pbuf , needed , & needed ) ;
GetPrinterDriverA ( hprn , NULL , 3 , NULL , 0 , & needed ) ;
dbuf = HeapAlloc ( GetProcessHeap ( ) , 0 , needed ) ;
if ( ! GetPrinterDriverA ( hprn , NULL , 3 , ( LPBYTE ) dbuf , needed , & needed ) ) {
2006-10-13 15:04:43 +02:00
ERR ( " GetPrinterDriverA failed, le %d, fix your config for printer %s! \n " , GetLastError ( ) , pbuf - > pPrinterName ) ;
2002-06-01 01:06:46 +02:00
COMDLG32_SetCommDlgExtendedError ( PDERR_RETDEFFAILURE ) ;
2002-04-11 19:32:49 +02:00
return FALSE ;
}
ClosePrinter ( hprn ) ;
PRINTDLG_CreateDevNames ( & ( lppd - > hDevNames ) ,
dbuf - > pDriverPath ,
pbuf - > pPrinterName ,
pbuf - > pPortName ) ;
lppd - > hDevMode = GlobalAlloc ( GMEM_MOVEABLE , pbuf - > pDevMode - > dmSize +
pbuf - > pDevMode - > dmDriverExtra ) ;
ptr = GlobalLock ( lppd - > hDevMode ) ;
memcpy ( ptr , pbuf - > pDevMode , pbuf - > pDevMode - > dmSize +
pbuf - > pDevMode - > dmDriverExtra ) ;
GlobalUnlock ( lppd - > hDevMode ) ;
HeapFree ( GetProcessHeap ( ) , 0 , pbuf ) ;
HeapFree ( GetProcessHeap ( ) , 0 , dbuf ) ;
bRet = TRUE ;
} else {
HGLOBAL hDlgTmpl ;
PRINT_PTRA * PrintStructures ;
2002-06-01 01:06:46 +02:00
/* load Dialog resources,
* depending on Flags indicates Print32 or Print32_setup dialog
2002-04-11 19:32:49 +02:00
*/
hDlgTmpl = PRINTDLG_GetDlgTemplateA ( lppd ) ;
if ( ! hDlgTmpl ) {
COMDLG32_SetCommDlgExtendedError ( CDERR_LOADRESFAILURE ) ;
return FALSE ;
}
ptr = LockResource ( hDlgTmpl ) ;
if ( ! ptr ) {
COMDLG32_SetCommDlgExtendedError ( CDERR_LOADRESFAILURE ) ;
return FALSE ;
}
PrintStructures = HeapAlloc ( GetProcessHeap ( ) , HEAP_ZERO_MEMORY ,
sizeof ( PRINT_PTRA ) ) ;
2004-01-09 06:10:35 +01:00
PrintStructures - > lpPrintDlg = lppd ;
2002-04-11 19:32:49 +02:00
/* and create & process the dialog .
* - 1 is failure , 0 is broken hwnd , everything else is ok .
*/
bRet = ( 0 < DialogBoxIndirectParamA ( hInst , ptr , lppd - > hwndOwner ,
PrintDlgProcA ,
( LPARAM ) PrintStructures ) ) ;
if ( bRet ) {
DEVMODEA * lpdm = PrintStructures - > lpDevMode , * lpdmReturn ;
PRINTER_INFO_2A * pi = PrintStructures - > lpPrinterInfo ;
DRIVER_INFO_3A * di = PrintStructures - > lpDriverInfo ;
if ( lppd - > hDevMode = = 0 ) {
TRACE ( " No hDevMode yet... Need to create my own \n " ) ;
lppd - > hDevMode = GlobalAlloc ( GMEM_MOVEABLE ,
lpdm - > dmSize + lpdm - > dmDriverExtra ) ;
} else {
lppd - > hDevMode = GlobalReAlloc ( lppd - > hDevMode ,
lpdm - > dmSize + lpdm - > dmDriverExtra ,
GMEM_MOVEABLE ) ;
}
lpdmReturn = GlobalLock ( lppd - > hDevMode ) ;
memcpy ( lpdmReturn , lpdm , lpdm - > dmSize + lpdm - > dmDriverExtra ) ;
PRINTDLG_CreateDevNames ( & ( lppd - > hDevNames ) ,
di - > pDriverPath ,
pi - > pPrinterName ,
pi - > pPortName
) ;
GlobalUnlock ( lppd - > hDevMode ) ;
}
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpDevMode ) ;
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpPrinterInfo ) ;
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpDriverInfo ) ;
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures ) ;
}
if ( bRet & & ( lppd - > Flags & PD_RETURNDC | | lppd - > Flags & PD_RETURNIC ) )
bRet = PRINTDLG_CreateDCA ( lppd ) ;
2002-06-01 01:06:46 +02:00
TRACE ( " exit! (%d) \n " , bRet ) ;
return bRet ;
2002-04-11 19:32:49 +02:00
}
/***********************************************************************
* PrintDlgW ( COMDLG32 . @ )
2005-11-12 20:12:25 +01:00
*
* See PrintDlgA .
2000-05-27 00:26:06 +02:00
*/
2006-12-14 18:13:01 +01:00
BOOL WINAPI PrintDlgW ( LPPRINTDLGW lppd )
2000-05-27 00:26:06 +02:00
{
BOOL bRet = FALSE ;
2006-12-14 18:13:01 +01:00
LPVOID ptr ;
HINSTANCE hInst ;
if ( ! lppd )
{
COMDLG32_SetCommDlgExtendedError ( CDERR_INITIALIZATION ) ;
return FALSE ;
}
2000-05-27 00:26:06 +02:00
2006-12-14 18:13:01 +01:00
hInst = ( HINSTANCE ) GetWindowLongPtrW ( lppd - > hwndOwner , GWLP_HINSTANCE ) ;
2000-05-27 00:26:06 +02:00
if ( TRACE_ON ( commdlg ) ) {
char flagstr [ 1000 ] = " " ;
2006-11-29 11:04:52 +01:00
const struct pd_flags * pflag = pd_flags ;
2000-05-27 00:26:06 +02:00
for ( ; pflag - > name ; pflag + + ) {
if ( lppd - > Flags & pflag - > flag )
strcat ( flagstr , pflag - > name ) ;
}
2002-11-22 00:55:10 +01:00
TRACE ( " (%p): hwndOwner = %p, hDevMode = %p, hDevNames = %p \n "
2006-10-13 15:04:43 +02:00
" pp. %d-%d, min p %d, max p %d, copies %d, hinst %p \n "
" flags %08x (%s) \n " ,
2000-05-27 00:26:06 +02:00
lppd , lppd - > hwndOwner , lppd - > hDevMode , lppd - > hDevNames ,
lppd - > nFromPage , lppd - > nToPage , lppd - > nMinPage , lppd - > nMaxPage ,
lppd - > nCopies , lppd - > hInstance , lppd - > Flags , flagstr ) ;
}
2002-04-11 19:32:49 +02:00
if ( lppd - > lStructSize ! = sizeof ( PRINTDLGW ) ) {
2000-05-27 00:26:06 +02:00
WARN ( " structure size failure !!! \n " ) ;
COMDLG32_SetCommDlgExtendedError ( CDERR_STRUCTSIZE ) ;
2002-06-01 01:06:46 +02:00
return FALSE ;
2000-05-27 00:26:06 +02:00
}
if ( lppd - > Flags & PD_RETURNDEFAULT ) {
2002-04-11 19:32:49 +02:00
PRINTER_INFO_2W * pbuf ;
DRIVER_INFO_3W * dbuf ;
2000-05-27 00:26:06 +02:00
HANDLE hprn ;
DWORD needed ;
if ( lppd - > hDevMode | | lppd - > hDevNames ) {
WARN ( " hDevMode or hDevNames non-zero for PD_RETURNDEFAULT \n " ) ;
2002-06-01 01:06:46 +02:00
COMDLG32_SetCommDlgExtendedError ( PDERR_RETDEFFAILURE ) ;
1999-02-28 21:05:11 +01:00
return FALSE ;
2000-05-27 00:26:06 +02:00
}
if ( ! PRINTDLG_OpenDefaultPrinter ( & hprn ) ) {
WARN ( " Can't find default printer \n " ) ;
2002-06-01 01:06:46 +02:00
COMDLG32_SetCommDlgExtendedError ( PDERR_NODEFAULTPRN ) ;
2000-05-27 00:26:06 +02:00
return FALSE ;
}
2002-04-11 19:32:49 +02:00
GetPrinterW ( hprn , 2 , NULL , 0 , & needed ) ;
pbuf = HeapAlloc ( GetProcessHeap ( ) , 0 , sizeof ( WCHAR ) * needed ) ;
GetPrinterW ( hprn , 2 , ( LPBYTE ) pbuf , needed , & needed ) ;
2001-05-02 03:10:43 +02:00
2002-04-11 19:32:49 +02:00
GetPrinterDriverW ( hprn , NULL , 3 , NULL , 0 , & needed ) ;
dbuf = HeapAlloc ( GetProcessHeap ( ) , 0 , sizeof ( WCHAR ) * needed ) ;
if ( ! GetPrinterDriverW ( hprn , NULL , 3 , ( LPBYTE ) dbuf , needed , & needed ) ) {
2006-10-13 15:04:43 +02:00
ERR ( " GetPrinterDriverA failed, le %d, fix your config for printer %s! \n " , GetLastError ( ) , debugstr_w ( pbuf - > pPrinterName ) ) ;
2002-06-01 01:06:46 +02:00
COMDLG32_SetCommDlgExtendedError ( PDERR_RETDEFFAILURE ) ;
2001-05-02 03:10:43 +02:00
return FALSE ;
}
2000-05-27 00:26:06 +02:00
ClosePrinter ( hprn ) ;
2001-05-02 03:10:43 +02:00
2002-04-11 19:32:49 +02:00
PRINTDLG_CreateDevNamesW ( & ( lppd - > hDevNames ) ,
2001-05-02 03:10:43 +02:00
dbuf - > pDriverPath ,
pbuf - > pPrinterName ,
2000-05-27 00:26:06 +02:00
pbuf - > pPortName ) ;
lppd - > hDevMode = GlobalAlloc ( GMEM_MOVEABLE , pbuf - > pDevMode - > dmSize +
pbuf - > pDevMode - > dmDriverExtra ) ;
ptr = GlobalLock ( lppd - > hDevMode ) ;
memcpy ( ptr , pbuf - > pDevMode , pbuf - > pDevMode - > dmSize +
pbuf - > pDevMode - > dmDriverExtra ) ;
GlobalUnlock ( lppd - > hDevMode ) ;
HeapFree ( GetProcessHeap ( ) , 0 , pbuf ) ;
2001-05-02 03:10:43 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , dbuf ) ;
2000-05-27 00:26:06 +02:00
bRet = TRUE ;
} else {
HGLOBAL hDlgTmpl ;
2002-04-11 19:32:49 +02:00
PRINT_PTRW * PrintStructures ;
2000-05-27 00:26:06 +02:00
2002-06-01 01:06:46 +02:00
/* load Dialog resources,
* depending on Flags indicates Print32 or Print32_setup dialog
2000-05-27 00:26:06 +02:00
*/
2002-04-11 19:32:49 +02:00
hDlgTmpl = PRINTDLG_GetDlgTemplateW ( lppd ) ;
2001-01-02 23:26:09 +01:00
if ( ! hDlgTmpl ) {
2000-05-27 00:26:06 +02:00
COMDLG32_SetCommDlgExtendedError ( CDERR_LOADRESFAILURE ) ;
return FALSE ;
}
2001-01-02 23:26:09 +01:00
ptr = LockResource ( hDlgTmpl ) ;
if ( ! ptr ) {
COMDLG32_SetCommDlgExtendedError ( CDERR_LOADRESFAILURE ) ;
return FALSE ;
}
2000-05-27 00:26:06 +02:00
PrintStructures = HeapAlloc ( GetProcessHeap ( ) , HEAP_ZERO_MEMORY ,
2002-04-11 19:32:49 +02:00
sizeof ( PRINT_PTRW ) ) ;
2004-01-09 06:10:35 +01:00
PrintStructures - > lpPrintDlg = lppd ;
2000-05-27 00:26:06 +02:00
2000-12-08 00:13:03 +01:00
/* and create & process the dialog .
* - 1 is failure , 0 is broken hwnd , everything else is ok .
2000-05-27 00:26:06 +02:00
*/
2002-04-11 19:32:49 +02:00
bRet = ( 0 < DialogBoxIndirectParamW ( hInst , ptr , lppd - > hwndOwner ,
PrintDlgProcW ,
2001-01-02 23:26:09 +01:00
( LPARAM ) PrintStructures ) ) ;
2000-05-27 00:26:06 +02:00
if ( bRet ) {
2002-04-11 19:32:49 +02:00
DEVMODEW * lpdm = PrintStructures - > lpDevMode , * lpdmReturn ;
PRINTER_INFO_2W * pi = PrintStructures - > lpPrinterInfo ;
DRIVER_INFO_3W * di = PrintStructures - > lpDriverInfo ;
2000-05-27 00:26:06 +02:00
if ( lppd - > hDevMode = = 0 ) {
TRACE ( " No hDevMode yet... Need to create my own \n " ) ;
lppd - > hDevMode = GlobalAlloc ( GMEM_MOVEABLE ,
lpdm - > dmSize + lpdm - > dmDriverExtra ) ;
} else {
WORD locks ;
if ( ( locks = ( GlobalFlags ( lppd - > hDevMode ) & GMEM_LOCKCOUNT ) ) ) {
WARN ( " hDevMode has %d locks on it. Unlocking it now \n " , locks ) ;
while ( locks - - ) {
GlobalUnlock ( lppd - > hDevMode ) ;
TRACE ( " Now got %d locks \n " , locks ) ;
}
}
lppd - > hDevMode = GlobalReAlloc ( lppd - > hDevMode ,
lpdm - > dmSize + lpdm - > dmDriverExtra ,
GMEM_MOVEABLE ) ;
}
lpdmReturn = GlobalLock ( lppd - > hDevMode ) ;
memcpy ( lpdmReturn , lpdm , lpdm - > dmSize + lpdm - > dmDriverExtra ) ;
if ( lppd - > hDevNames ! = 0 ) {
WORD locks ;
if ( ( locks = ( GlobalFlags ( lppd - > hDevNames ) & GMEM_LOCKCOUNT ) ) ) {
WARN ( " hDevNames has %d locks on it. Unlocking it now \n " , locks ) ;
while ( locks - - )
GlobalUnlock ( lppd - > hDevNames ) ;
}
}
2002-04-11 19:32:49 +02:00
PRINTDLG_CreateDevNamesW ( & ( lppd - > hDevNames ) ,
2001-05-02 03:10:43 +02:00
di - > pDriverPath ,
pi - > pPrinterName ,
pi - > pPortName
) ;
2000-05-27 00:26:06 +02:00
GlobalUnlock ( lppd - > hDevMode ) ;
}
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpDevMode ) ;
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpPrinterInfo ) ;
2001-05-02 03:10:43 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures - > lpDriverInfo ) ;
2000-05-27 00:26:06 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , PrintStructures ) ;
}
if ( bRet & & ( lppd - > Flags & PD_RETURNDC | | lppd - > Flags & PD_RETURNIC ) )
2002-04-11 19:32:49 +02:00
bRet = PRINTDLG_CreateDCW ( lppd ) ;
2000-05-27 00:26:06 +02:00
2002-06-01 01:06:46 +02:00
TRACE ( " exit! (%d) \n " , bRet ) ;
return bRet ;
2000-05-27 00:26:06 +02:00
}
/***********************************************************************
*
* PageSetupDlg
2001-05-05 02:44:03 +02:00
* rad1 - portrait
* rad2 - landscape
2007-02-14 16:22:07 +01:00
* cmb1 - printer select ( not in standard dialog template )
2001-05-05 02:44:03 +02:00
* cmb2 - paper size
* cmb3 - source ( tray ? )
* edt4 - border left
* edt5 - border top
* edt6 - border right
* edt7 - border bottom
* psh3 - " Printer... "
2000-05-27 00:26:06 +02:00
*/
1999-02-28 21:05:11 +01:00
2001-05-05 02:44:03 +02:00
typedef struct {
2005-07-07 20:23:45 +02:00
LPPAGESETUPDLGA dlga ; /* Handler to user defined struct */
2001-05-05 02:44:03 +02:00
PRINTDLGA pdlg ;
2005-07-07 20:23:45 +02:00
HWND hDlg ; /* Page Setup dialog handler */
2007-02-14 16:22:07 +01:00
PAGESETUPDLGA curdlg ; /* Stores the current dialog state */
2005-07-07 20:23:45 +02:00
RECT rtDrawRect ; /* Drawing rect for page */
2002-04-11 19:32:49 +02:00
} PageSetupDataA ;
typedef struct {
LPPAGESETUPDLGW dlga ;
PRINTDLGW pdlg ;
} PageSetupDataW ;
2001-05-05 02:44:03 +02:00
2005-07-07 20:23:45 +02:00
2007-04-06 11:56:15 +02:00
static HGLOBAL PRINTDLG_GetPGSTemplateA ( const PAGESETUPDLGA * lppd )
2001-05-05 02:44:03 +02:00
{
2002-09-17 00:47:05 +02:00
HRSRC hResInfo ;
HGLOBAL hDlgTmpl ;
2005-07-07 20:23:45 +02:00
2001-05-05 02:44:03 +02:00
if ( lppd - > Flags & PSD_ENABLEPAGESETUPTEMPLATEHANDLE ) {
hDlgTmpl = lppd - > hPageSetupTemplate ;
2002-06-01 01:06:46 +02:00
} else if ( lppd - > Flags & PSD_ENABLEPAGESETUPTEMPLATE ) {
2001-05-05 02:44:03 +02:00
hResInfo = FindResourceA ( lppd - > hInstance ,
2003-09-10 05:56:47 +02:00
lppd - > lpPageSetupTemplateName , ( LPSTR ) RT_DIALOG ) ;
2001-05-05 02:44:03 +02:00
hDlgTmpl = LoadResource ( lppd - > hInstance , hResInfo ) ;
} else {
2003-09-10 05:56:47 +02:00
hResInfo = FindResourceA ( COMDLG32_hInstance , ( LPCSTR ) PAGESETUPDLGORD , ( LPSTR ) RT_DIALOG ) ;
2001-05-05 02:44:03 +02:00
hDlgTmpl = LoadResource ( COMDLG32_hInstance , hResInfo ) ;
}
return hDlgTmpl ;
}
2007-04-06 11:56:15 +02:00
static HGLOBAL PRINTDLG_GetPGSTemplateW ( const PAGESETUPDLGW * lppd )
2002-04-11 19:32:49 +02:00
{
2002-09-17 00:47:05 +02:00
HRSRC hResInfo ;
HGLOBAL hDlgTmpl ;
2002-04-11 19:32:49 +02:00
if ( lppd - > Flags & PSD_ENABLEPAGESETUPTEMPLATEHANDLE ) {
hDlgTmpl = lppd - > hPageSetupTemplate ;
2002-06-01 01:06:46 +02:00
} else if ( lppd - > Flags & PSD_ENABLEPAGESETUPTEMPLATE ) {
2002-04-11 19:32:49 +02:00
hResInfo = FindResourceW ( lppd - > hInstance ,
2003-09-10 05:56:47 +02:00
lppd - > lpPageSetupTemplateName , ( LPWSTR ) RT_DIALOG ) ;
2002-04-11 19:32:49 +02:00
hDlgTmpl = LoadResource ( lppd - > hInstance , hResInfo ) ;
} else {
2003-09-10 05:56:47 +02:00
hResInfo = FindResourceW ( COMDLG32_hInstance , ( LPCWSTR ) PAGESETUPDLGORD , ( LPWSTR ) RT_DIALOG ) ;
2002-04-11 19:32:49 +02:00
hDlgTmpl = LoadResource ( COMDLG32_hInstance , hResInfo ) ;
}
return hDlgTmpl ;
}
2001-05-05 02:44:03 +02:00
static DWORD
_c_10mm2size ( PAGESETUPDLGA * dlga , DWORD size ) {
if ( dlga - > Flags & PSD_INTHOUSANDTHSOFINCHES )
2005-07-07 20:23:45 +02:00
return 10 * size * 100 / 254 ;
2001-05-05 02:44:03 +02:00
/* If we don't have a flag, we can choose one. Use millimeters
* to avoid confusing me
*/
dlga - > Flags | = PSD_INHUNDREDTHSOFMILLIMETERS ;
return 10 * size ;
}
static DWORD
_c_inch2size ( PAGESETUPDLGA * dlga , DWORD size ) {
if ( dlga - > Flags & PSD_INTHOUSANDTHSOFINCHES )
return size ;
if ( dlga - > Flags & PSD_INHUNDREDTHSOFMILLIMETERS )
2005-07-07 20:23:45 +02:00
return ( size * 254 ) / 100 ;
2001-05-05 02:44:03 +02:00
/* if we don't have a flag, we can choose one. Use millimeters
* to avoid confusing me
*/
dlga - > Flags | = PSD_INHUNDREDTHSOFMILLIMETERS ;
2005-07-07 20:23:45 +02:00
return ( size * 254 ) / 100 ;
2001-05-05 02:44:03 +02:00
}
static void
2002-04-11 19:32:49 +02:00
_c_size2strA ( PageSetupDataA * pda , DWORD size , LPSTR strout ) {
strcpy ( strout , " <undef> " ) ;
if ( pda - > dlga - > Flags & PSD_INHUNDREDTHSOFMILLIMETERS ) {
2006-10-13 15:04:43 +02:00
sprintf ( strout , " %d " , ( size ) / 100 ) ;
2002-04-11 19:32:49 +02:00
return ;
}
if ( pda - > dlga - > Flags & PSD_INTHOUSANDTHSOFINCHES ) {
2006-10-13 15:04:43 +02:00
sprintf ( strout , " %din " , ( size ) / 1000 ) ;
2002-04-11 19:32:49 +02:00
return ;
}
pda - > dlga - > Flags | = PSD_INHUNDREDTHSOFMILLIMETERS ;
2006-10-13 15:04:43 +02:00
sprintf ( strout , " %d " , ( size ) / 100 ) ;
2002-04-11 19:32:49 +02:00
return ;
}
static void
2004-09-22 21:11:05 +02:00
_c_size2strW ( PageSetupDataW * pda , DWORD size , LPWSTR strout ) {
2007-07-24 23:26:53 +02:00
static const char mm_fmt [ ] = " %.2f mm " ;
static const char in_fmt [ ] = " %.2f in " ;
char buf [ 20 ] ;
2001-05-05 02:44:03 +02:00
if ( pda - > dlga - > Flags & PSD_INHUNDREDTHSOFMILLIMETERS ) {
2007-07-24 23:26:53 +02:00
sprintf ( buf , mm_fmt , ( size * 1.0 ) / 100.0 ) ;
} else if ( pda - > dlga - > Flags & PSD_INTHOUSANDTHSOFINCHES ) {
sprintf ( buf , in_fmt , ( size * 1.0 ) / 1000.0 ) ;
} else {
pda - > dlga - > Flags | = PSD_INHUNDREDTHSOFMILLIMETERS ;
sprintf ( buf , mm_fmt , ( size * 1.0 ) / 100.0 ) ;
2001-05-05 02:44:03 +02:00
}
2007-07-24 23:26:53 +02:00
MultiByteToWideChar ( CP_ACP , 0 , buf , - 1 , strout , 20 ) ;
2001-05-05 02:44:03 +02:00
}
static DWORD
2007-04-06 11:56:15 +02:00
_c_str2sizeA ( const PAGESETUPDLGA * dlga , LPCSTR strin ) {
2001-05-05 02:44:03 +02:00
float val ;
char rest [ 200 ] ;
rest [ 0 ] = ' \0 ' ;
if ( ! sscanf ( strin , " %f%s " , & val , rest ) )
return 0 ;
if ( ! strcmp ( rest , " in " ) | | ! strcmp ( rest , " inch " ) ) {
2002-04-11 19:32:49 +02:00
if ( dlga - > Flags & PSD_INTHOUSANDTHSOFINCHES )
2001-05-05 02:44:03 +02:00
return 1000 * val ;
else
return val * 25.4 * 100 ;
}
if ( ! strcmp ( rest , " cm " ) ) { rest [ 0 ] = ' m ' ; val = val * 10.0 ; }
if ( ! strcmp ( rest , " m " ) ) { strcpy ( rest , " mm " ) ; val = val * 1000.0 ; }
if ( ! strcmp ( rest , " mm " ) ) {
2002-04-11 19:32:49 +02:00
if ( dlga - > Flags & PSD_INHUNDREDTHSOFMILLIMETERS )
2001-05-05 02:44:03 +02:00
return 100 * val ;
else
return 1000.0 * val / 25.4 ;
}
if ( rest [ 0 ] = = ' \0 ' ) {
/* use application supplied default */
2002-04-11 19:32:49 +02:00
if ( dlga - > Flags & PSD_INHUNDREDTHSOFMILLIMETERS ) {
2001-05-05 02:44:03 +02:00
/* 100*mm */
return 100.0 * val ;
}
2002-04-11 19:32:49 +02:00
if ( dlga - > Flags & PSD_INTHOUSANDTHSOFINCHES ) {
2001-05-05 02:44:03 +02:00
/* 1000*inch */
return 1000.0 * val ;
}
}
ERR ( " Did not find a conversion for type '%s'! \n " , rest ) ;
return 0 ;
}
2004-09-22 21:11:05 +02:00
static DWORD
2007-04-06 11:56:15 +02:00
_c_str2sizeW ( const PAGESETUPDLGW * dlga , LPCWSTR strin ) {
2004-09-22 21:11:05 +02:00
char buf [ 200 ] ;
/* this W -> A transition is OK */
/* we need a unicode version of sscanf to avoid it */
WideCharToMultiByte ( CP_ACP , 0 , strin , - 1 , buf , sizeof ( buf ) , NULL , NULL ) ;
2007-04-06 11:56:15 +02:00
return _c_str2sizeA ( ( const PAGESETUPDLGA * ) dlga , buf ) ;
2004-09-22 21:11:05 +02:00
}
2005-07-07 20:23:45 +02:00
/****************************************************************************
* PRINTDLG_PS_UpdateDlgStructA
*
* Updates pda - > dlga structure
* Function calls when user presses OK button
*
* PARAMS
* hDlg [ in ] main window dialog HANDLE
2007-02-14 16:22:07 +01:00
* pda [ in / out ] ptr to PageSetupDataA structure
*
2005-07-07 20:23:45 +02:00
* RETURNS
* TRUE
2001-05-05 02:44:03 +02:00
*/
static BOOL
2002-04-11 19:32:49 +02:00
PRINTDLG_PS_UpdateDlgStructA ( HWND hDlg , PageSetupDataA * pda ) {
2001-05-05 02:44:03 +02:00
DEVNAMES * dn ;
DEVMODEA * dm ;
2005-07-07 20:23:45 +02:00
DWORD paperword ;
2002-06-01 01:06:46 +02:00
2005-07-07 20:23:45 +02:00
memcpy ( pda - > dlga , & pda - > curdlg , sizeof ( pda - > curdlg ) ) ;
pda - > dlga - > hDevMode = pda - > pdlg . hDevMode ;
pda - > dlga - > hDevNames = pda - > pdlg . hDevNames ;
2001-05-05 02:44:03 +02:00
dn = GlobalLock ( pda - > pdlg . hDevNames ) ;
dm = GlobalLock ( pda - > pdlg . hDevMode ) ;
2006-01-11 12:10:33 +01:00
/* Save paper orientation into device context */
2005-07-07 20:23:45 +02:00
if ( pda - > curdlg . ptPaperSize . x > pda - > curdlg . ptPaperSize . y )
2006-01-11 12:10:33 +01:00
dm - > u1 . s1 . dmOrientation = DMORIENT_LANDSCAPE ;
2005-07-07 20:23:45 +02:00
else
2006-01-11 12:10:33 +01:00
dm - > u1 . s1 . dmOrientation = DMORIENT_PORTRAIT ;
/* Save paper size into the device context */
2005-07-07 20:23:45 +02:00
paperword = SendDlgItemMessageA ( hDlg , cmb2 , CB_GETITEMDATA ,
2006-01-11 12:10:33 +01:00
SendDlgItemMessageA ( hDlg , cmb2 , CB_GETCURSEL , 0 , 0 ) , 0 ) ;
2005-07-07 20:23:45 +02:00
if ( paperword ! = CB_ERR )
2006-01-11 12:10:33 +01:00
dm - > u1 . s1 . dmPaperSize = paperword ;
2005-07-07 20:23:45 +02:00
else
2006-01-11 12:10:33 +01:00
FIXME ( " could not get dialog text for papersize cmbbox? \n " ) ;
/* Save paper source into the device context */
paperword = SendDlgItemMessageA ( hDlg , cmb1 , CB_GETITEMDATA ,
SendDlgItemMessageA ( hDlg , cmb1 , CB_GETCURSEL , 0 , 0 ) , 0 ) ;
if ( paperword ! = CB_ERR )
dm - > dmDefaultSource = paperword ;
else
FIXME ( " could not get dialog text for papersize cmbbox? \n " ) ;
2002-04-11 19:32:49 +02:00
GlobalUnlock ( pda - > pdlg . hDevNames ) ;
GlobalUnlock ( pda - > pdlg . hDevMode ) ;
2005-07-07 20:23:45 +02:00
2002-04-11 19:32:49 +02:00
return TRUE ;
}
static BOOL
PRINTDLG_PS_UpdateDlgStructW ( HWND hDlg , PageSetupDataW * pda ) {
DEVNAMES * dn ;
DEVMODEW * dm ;
LPWSTR devname , portname ;
WCHAR papername [ 64 ] ;
2004-09-22 21:11:05 +02:00
WCHAR buf [ 200 ] ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
dn = GlobalLock ( pda - > pdlg . hDevNames ) ;
dm = GlobalLock ( pda - > pdlg . hDevMode ) ;
devname = ( ( WCHAR * ) dn ) + dn - > wDeviceOffset ;
portname = ( ( WCHAR * ) dn ) + dn - > wOutputOffset ;
2006-01-11 12:10:33 +01:00
/* Save paper size into device context */
2002-04-11 19:32:49 +02:00
PRINTDLG_SetUpPaperComboBoxW ( hDlg , cmb2 , devname , portname , dm ) ;
2006-01-11 12:10:33 +01:00
/* Save paper source into device context */
2002-04-11 19:32:49 +02:00
PRINTDLG_SetUpPaperComboBoxW ( hDlg , cmb3 , devname , portname , dm ) ;
if ( GetDlgItemTextW ( hDlg , cmb2 , papername , sizeof ( papername ) ) > 0 ) {
PRINTDLG_PaperSizeW ( & ( pda - > pdlg ) , papername , & ( pda - > dlga - > ptPaperSize ) ) ;
pda - > dlga - > ptPaperSize . x = _c_10mm2size ( ( LPPAGESETUPDLGA ) pda - > dlga , pda - > dlga - > ptPaperSize . x ) ;
pda - > dlga - > ptPaperSize . y = _c_10mm2size ( ( LPPAGESETUPDLGA ) pda - > dlga , pda - > dlga - > ptPaperSize . y ) ;
} else
FIXME ( " could not get dialog text for papersize cmbbox? \n " ) ;
2004-09-22 21:11:05 +02:00
# define GETVAL(id,val) if (GetDlgItemTextW(hDlg,id,buf,sizeof(buf) / sizeof(buf[0]))>0) { val = _c_str2sizeW(pda->dlga,buf); } else { FIXME("could not get dlgitemtextw for %x\n",id); }
2001-05-05 02:44:03 +02:00
GETVAL ( edt4 , pda - > dlga - > rtMargin . left ) ;
GETVAL ( edt5 , pda - > dlga - > rtMargin . top ) ;
GETVAL ( edt6 , pda - > dlga - > rtMargin . right ) ;
GETVAL ( edt7 , pda - > dlga - > rtMargin . bottom ) ;
# undef GETVAL
/* If we are in landscape, swap x and y of page size */
if ( IsDlgButtonChecked ( hDlg , rad2 ) ) {
DWORD tmp ;
tmp = pda - > dlga - > ptPaperSize . x ;
pda - > dlga - > ptPaperSize . x = pda - > dlga - > ptPaperSize . y ;
pda - > dlga - > ptPaperSize . y = tmp ;
}
2007-08-04 23:14:20 +02:00
/* Save orientation */
if ( pda - > dlga - > ptPaperSize . x > pda - > dlga - > ptPaperSize . y )
dm - > u1 . s1 . dmOrientation = DMORIENT_LANDSCAPE ;
else
dm - > u1 . s1 . dmOrientation = DMORIENT_PORTRAIT ;
2001-05-05 02:44:03 +02:00
GlobalUnlock ( pda - > pdlg . hDevNames ) ;
GlobalUnlock ( pda - > pdlg . hDevMode ) ;
return TRUE ;
}
2005-07-07 20:23:45 +02:00
/**********************************************************************************************
* PRINTDLG_PS_ChangeActivePrinerA
*
* Redefines hDevMode and hDevNames HANDLES and initialises it .
*
* PARAMS
* name [ in ] Name of a printer for activation
* pda [ in / out ] ptr to PageSetupDataA structure
*
* RETURN
* TRUE if success
* FALSE if fail
*/
static BOOL
PRINTDLG_PS_ChangeActivePrinterA ( LPSTR name , PageSetupDataA * pda ) {
HANDLE hprn ;
DWORD needed ;
LPPRINTER_INFO_2A lpPrinterInfo ;
LPDRIVER_INFO_3A lpDriverInfo ;
DEVMODEA * pDevMode , * dm ;
if ( ! OpenPrinterA ( name , & hprn , NULL ) ) {
ERR ( " Can't open printer %s \n " , name ) ;
return FALSE ;
}
GetPrinterA ( hprn , 2 , NULL , 0 , & needed ) ;
lpPrinterInfo = HeapAlloc ( GetProcessHeap ( ) , 0 , needed ) ;
GetPrinterA ( hprn , 2 , ( LPBYTE ) lpPrinterInfo , needed , & needed ) ;
GetPrinterDriverA ( hprn , NULL , 3 , NULL , 0 , & needed ) ;
lpDriverInfo = HeapAlloc ( GetProcessHeap ( ) , 0 , needed ) ;
if ( ! GetPrinterDriverA ( hprn , NULL , 3 , ( LPBYTE ) lpDriverInfo , needed , & needed ) ) {
ERR ( " GetPrinterDriverA failed for %s, fix your config! \n " , lpPrinterInfo - > pPrinterName ) ;
return FALSE ;
}
ClosePrinter ( hprn ) ;
needed = DocumentPropertiesA ( 0 , 0 , name , NULL , NULL , 0 ) ;
if ( needed = = - 1 ) {
ERR ( " DocumentProperties fails on %s \n " , debugstr_a ( name ) ) ;
return FALSE ;
}
pDevMode = HeapAlloc ( GetProcessHeap ( ) , 0 , needed ) ;
DocumentPropertiesA ( 0 , 0 , name , pDevMode , NULL , DM_OUT_BUFFER ) ;
pda - > pdlg . hDevMode = GlobalReAlloc ( pda - > pdlg . hDevMode ,
pDevMode - > dmSize + pDevMode - > dmDriverExtra ,
GMEM_MOVEABLE ) ;
dm = GlobalLock ( pda - > pdlg . hDevMode ) ;
memcpy ( dm , pDevMode , pDevMode - > dmSize + pDevMode - > dmDriverExtra ) ;
PRINTDLG_CreateDevNames ( & ( pda - > pdlg . hDevNames ) ,
lpDriverInfo - > pDriverPath ,
lpPrinterInfo - > pPrinterName ,
lpPrinterInfo - > pPortName ) ;
GlobalUnlock ( pda - > pdlg . hDevMode ) ;
HeapFree ( GetProcessHeap ( ) , 0 , pDevMode ) ;
HeapFree ( GetProcessHeap ( ) , 0 , lpPrinterInfo ) ;
HeapFree ( GetProcessHeap ( ) , 0 , lpDriverInfo ) ;
return TRUE ;
}
/****************************************************************************************
* PRINTDLG_PS_ChangePrinterA
*
* Fills Printers , Paper and Source combo
*
* RETURNS
* TRUE
2001-05-05 02:44:03 +02:00
*/
static BOOL
2002-04-11 19:32:49 +02:00
PRINTDLG_PS_ChangePrinterA ( HWND hDlg , PageSetupDataA * pda ) {
2001-05-05 02:44:03 +02:00
DEVNAMES * dn ;
DEVMODEA * dm ;
LPSTR devname , portname ;
2005-07-07 20:23:45 +02:00
2001-05-05 02:44:03 +02:00
dn = GlobalLock ( pda - > pdlg . hDevNames ) ;
dm = GlobalLock ( pda - > pdlg . hDevMode ) ;
2005-07-07 20:23:45 +02:00
devname = ( ( char * ) dn ) + dn - > wDeviceOffset ;
2001-05-05 02:44:03 +02:00
portname = ( ( char * ) dn ) + dn - > wOutputOffset ;
2005-07-07 20:23:45 +02:00
PRINTDLG_SetUpPrinterListComboA ( hDlg , cmb1 , devname ) ;
2002-04-11 19:32:49 +02:00
PRINTDLG_SetUpPaperComboBoxA ( hDlg , cmb2 , devname , portname , dm ) ;
PRINTDLG_SetUpPaperComboBoxA ( hDlg , cmb3 , devname , portname , dm ) ;
GlobalUnlock ( pda - > pdlg . hDevNames ) ;
GlobalUnlock ( pda - > pdlg . hDevMode ) ;
return TRUE ;
}
static BOOL
PRINTDLG_PS_ChangePrinterW ( HWND hDlg , PageSetupDataW * pda ) {
DEVNAMES * dn ;
DEVMODEW * dm ;
LPWSTR devname , portname ;
2002-06-01 01:06:46 +02:00
2002-04-11 19:32:49 +02:00
dn = GlobalLock ( pda - > pdlg . hDevNames ) ;
dm = GlobalLock ( pda - > pdlg . hDevMode ) ;
devname = ( ( WCHAR * ) dn ) + dn - > wDeviceOffset ;
portname = ( ( WCHAR * ) dn ) + dn - > wOutputOffset ;
PRINTDLG_SetUpPaperComboBoxW ( hDlg , cmb2 , devname , portname , dm ) ;
PRINTDLG_SetUpPaperComboBoxW ( hDlg , cmb3 , devname , portname , dm ) ;
2001-05-05 02:44:03 +02:00
GlobalUnlock ( pda - > pdlg . hDevNames ) ;
GlobalUnlock ( pda - > pdlg . hDevMode ) ;
return TRUE ;
}
2005-07-07 20:23:45 +02:00
/******************************************************************************************
* PRINTDLG_PS_ChangePaperPrev
*
* Changes paper preview size / position
*
* PARAMS :
* pda [ i ] Pointer for current PageSetupDataA structure
*
* RETURNS :
* always - TRUE
*/
static BOOL
2007-04-06 11:56:15 +02:00
PRINTDLG_PS_ChangePaperPrev ( const PageSetupDataA * pda )
2005-07-07 20:23:45 +02:00
{
LONG width , height , x , y ;
RECT rtTmp ;
if ( pda - > curdlg . ptPaperSize . x > pda - > curdlg . ptPaperSize . y ) {
width = pda - > rtDrawRect . right - pda - > rtDrawRect . left ;
height = pda - > curdlg . ptPaperSize . y * width / pda - > curdlg . ptPaperSize . x ;
} else {
height = pda - > rtDrawRect . bottom - pda - > rtDrawRect . top ;
width = pda - > curdlg . ptPaperSize . x * height / pda - > curdlg . ptPaperSize . y ;
}
x = ( pda - > rtDrawRect . right + pda - > rtDrawRect . left - width ) / 2 ;
y = ( pda - > rtDrawRect . bottom + pda - > rtDrawRect . top - height ) / 2 ;
2006-10-13 15:04:43 +02:00
TRACE ( " rtDrawRect(%d, %d, %d, %d) x=%d, y=%d, w=%d, h=%d \n " ,
2005-07-07 20:23:45 +02:00
pda - > rtDrawRect . left , pda - > rtDrawRect . top , pda - > rtDrawRect . right , pda - > rtDrawRect . bottom ,
x , y , width , height ) ;
# define SHADOW 4
MoveWindow ( GetDlgItem ( pda - > hDlg , rct2 ) , x + width , y + SHADOW , SHADOW , height , FALSE ) ;
MoveWindow ( GetDlgItem ( pda - > hDlg , rct3 ) , x + SHADOW , y + height , width , SHADOW , FALSE ) ;
MoveWindow ( GetDlgItem ( pda - > hDlg , rct1 ) , x , y , width , height , FALSE ) ;
memcpy ( & rtTmp , & pda - > rtDrawRect , sizeof ( RECT ) ) ;
rtTmp . right + = SHADOW ;
rtTmp . bottom + = SHADOW ;
# undef SHADOW
InvalidateRect ( pda - > hDlg , & rtTmp , TRUE ) ;
return TRUE ;
}
# define GETVAL(idc,val) \
if ( msg = = EN_CHANGE ) { \
if ( GetDlgItemTextA ( hDlg , idc , buf , sizeof ( buf ) ) > 0 ) \
val = _c_str2sizeA ( pda - > dlga , buf ) ; \
else \
FIXME ( " could not get dlgitemtexta for %x \n " , id ) ; \
}
/********************************************************************************
* PRINTDLG_PS_WMCommandA
* process WM_COMMAND message for PageSetupDlgA
*
* PARAMS
* hDlg [ in ] Main dialog HANDLE
* wParam [ in ] WM_COMMAND wParam
* lParam [ in ] WM_COMMAND lParam
* pda [ in / out ] ptr to PageSetupDataA
*/
2001-05-05 02:44:03 +02:00
static BOOL
2002-04-11 19:32:49 +02:00
PRINTDLG_PS_WMCommandA (
HWND hDlg , WPARAM wParam , LPARAM lParam , PageSetupDataA * pda
2001-05-05 02:44:03 +02:00
) {
2005-07-07 20:23:45 +02:00
WORD msg = HIWORD ( wParam ) ;
WORD id = LOWORD ( wParam ) ;
char buf [ 200 ] ;
2007-05-24 16:41:17 +02:00
TRACE ( " loword (lparam) %d, wparam 0x%lx, lparam %08lx \n " ,
2005-01-24 12:26:23 +01:00
LOWORD ( lParam ) , wParam , lParam ) ;
2005-07-07 20:23:45 +02:00
switch ( id ) {
2001-05-05 02:44:03 +02:00
case IDOK :
2002-04-11 19:32:49 +02:00
if ( ! PRINTDLG_PS_UpdateDlgStructA ( hDlg , pda ) )
2001-05-05 02:44:03 +02:00
return ( FALSE ) ;
EndDialog ( hDlg , TRUE ) ;
return TRUE ;
case IDCANCEL :
EndDialog ( hDlg , FALSE ) ;
return FALSE ;
case psh3 : {
pda - > pdlg . Flags = 0 ;
pda - > pdlg . hwndOwner = hDlg ;
if ( PrintDlgA ( & ( pda - > pdlg ) ) )
2002-04-11 19:32:49 +02:00
PRINTDLG_PS_ChangePrinterA ( hDlg , pda ) ;
2005-07-07 20:23:45 +02:00
}
2002-04-11 19:32:49 +02:00
return TRUE ;
2005-07-07 20:23:45 +02:00
case rad1 :
if ( pda - > curdlg . ptPaperSize . x > pda - > curdlg . ptPaperSize . y ) {
DWORD tmp = pda - > curdlg . ptPaperSize . x ;
pda - > curdlg . ptPaperSize . x = pda - > curdlg . ptPaperSize . y ;
pda - > curdlg . ptPaperSize . y = tmp ;
}
PRINTDLG_PS_ChangePaperPrev ( pda ) ;
break ;
case rad2 :
if ( pda - > curdlg . ptPaperSize . y > pda - > curdlg . ptPaperSize . x ) {
DWORD tmp = pda - > curdlg . ptPaperSize . x ;
pda - > curdlg . ptPaperSize . x = pda - > curdlg . ptPaperSize . y ;
pda - > curdlg . ptPaperSize . y = tmp ;
}
PRINTDLG_PS_ChangePaperPrev ( pda ) ;
break ;
case cmb1 : /* Printer combo */
if ( msg = = CBN_SELCHANGE ) {
char crPrinterName [ 256 ] ;
GetDlgItemTextA ( hDlg , id , crPrinterName , 255 ) ;
PRINTDLG_PS_ChangeActivePrinterA ( crPrinterName , pda ) ;
PRINTDLG_PS_ChangePrinterA ( hDlg , pda ) ;
}
break ;
case cmb2 : /* Paper combo */
if ( msg = = CBN_SELCHANGE ) {
DWORD paperword = SendDlgItemMessageA ( hDlg , cmb2 , CB_GETITEMDATA ,
SendDlgItemMessageA ( hDlg , cmb2 , CB_GETCURSEL , 0 , 0 ) , 0 ) ;
if ( paperword ! = CB_ERR ) {
PRINTDLG_PaperSizeA ( & ( pda - > pdlg ) , paperword , & ( pda - > curdlg . ptPaperSize ) ) ;
pda - > curdlg . ptPaperSize . x = _c_10mm2size ( pda - > dlga , pda - > curdlg . ptPaperSize . x ) ;
pda - > curdlg . ptPaperSize . y = _c_10mm2size ( pda - > dlga , pda - > curdlg . ptPaperSize . y ) ;
if ( IsDlgButtonChecked ( hDlg , rad2 ) ) {
DWORD tmp = pda - > curdlg . ptPaperSize . x ;
pda - > curdlg . ptPaperSize . x = pda - > curdlg . ptPaperSize . y ;
pda - > curdlg . ptPaperSize . y = tmp ;
}
PRINTDLG_PS_ChangePaperPrev ( pda ) ;
} else
FIXME ( " could not get dialog text for papersize cmbbox? \n " ) ;
}
break ;
case cmb3 :
if ( msg = = CBN_SELCHANGE ) {
DEVMODEA * dm = GlobalLock ( pda - > pdlg . hDevMode ) ;
dm - > dmDefaultSource = SendDlgItemMessageA ( hDlg , cmb3 , CB_GETITEMDATA ,
SendDlgItemMessageA ( hDlg , cmb3 , CB_GETCURSEL , 0 , 0 ) , 0 ) ;
GlobalUnlock ( pda - > pdlg . hDevMode ) ;
}
break ;
case psh2 : /* Printer Properties button */
{
HANDLE hPrinter ;
char PrinterName [ 256 ] ;
DEVMODEA * dm ;
LRESULT count ;
int i ;
GetDlgItemTextA ( hDlg , cmb1 , PrinterName , 255 ) ;
if ( ! OpenPrinterA ( PrinterName , & hPrinter , NULL ) ) {
FIXME ( " Call to OpenPrinter did not succeed! \n " ) ;
break ;
}
dm = GlobalLock ( pda - > pdlg . hDevMode ) ;
DocumentPropertiesA ( hDlg , hPrinter , PrinterName , dm , dm ,
DM_IN_BUFFER | DM_OUT_BUFFER | DM_IN_PROMPT ) ;
ClosePrinter ( hPrinter ) ;
/* Changing paper */
PRINTDLG_PaperSizeA ( & ( pda - > pdlg ) , dm - > u1 . s1 . dmPaperSize , & ( pda - > curdlg . ptPaperSize ) ) ;
pda - > curdlg . ptPaperSize . x = _c_10mm2size ( pda - > dlga , pda - > curdlg . ptPaperSize . x ) ;
pda - > curdlg . ptPaperSize . y = _c_10mm2size ( pda - > dlga , pda - > curdlg . ptPaperSize . y ) ;
if ( dm - > u1 . s1 . dmOrientation = = DMORIENT_LANDSCAPE ) {
DWORD tmp = pda - > curdlg . ptPaperSize . x ;
pda - > curdlg . ptPaperSize . x = pda - > curdlg . ptPaperSize . y ;
pda - > curdlg . ptPaperSize . y = tmp ;
CheckRadioButton ( hDlg , rad1 , rad2 , rad2 ) ;
}
else
CheckRadioButton ( hDlg , rad1 , rad2 , rad1 ) ;
/* Changing paper preview */
PRINTDLG_PS_ChangePaperPrev ( pda ) ;
/* Selecting paper in combo */
count = SendDlgItemMessageA ( hDlg , cmb2 , CB_GETCOUNT , 0 , 0 ) ;
if ( count ! = CB_ERR ) {
for ( i = 0 ; i < count ; + + i ) {
if ( SendDlgItemMessageA ( hDlg , cmb2 , CB_GETITEMDATA , i , 0 ) = = dm - > u1 . s1 . dmPaperSize ) {
SendDlgItemMessageA ( hDlg , cmb2 , CB_SETCURSEL , i , 0 ) ;
break ;
}
}
}
GlobalUnlock ( pda - > pdlg . hDevMode ) ;
break ;
}
case edt4 :
GETVAL ( id , pda - > curdlg . rtMargin . left ) ;
break ;
case edt5 :
GETVAL ( id , pda - > curdlg . rtMargin . right ) ;
break ;
case edt6 :
GETVAL ( id , pda - > curdlg . rtMargin . top ) ;
break ;
case edt7 :
GETVAL ( id , pda - > curdlg . rtMargin . bottom ) ;
break ;
2002-04-11 19:32:49 +02:00
}
2005-07-07 20:23:45 +02:00
InvalidateRect ( GetDlgItem ( hDlg , rct1 ) , NULL , TRUE ) ;
2002-04-11 19:32:49 +02:00
return FALSE ;
}
2005-07-07 20:23:45 +02:00
# undef GETVAL
2002-04-11 19:32:49 +02:00
static BOOL
PRINTDLG_PS_WMCommandW (
HWND hDlg , WPARAM wParam , LPARAM lParam , PageSetupDataW * pda
) {
2007-05-24 16:41:17 +02:00
TRACE ( " loword (lparam) %d, wparam 0x%lx, lparam %08lx \n " ,
2005-01-24 12:26:23 +01:00
LOWORD ( lParam ) , wParam , lParam ) ;
2002-04-11 19:32:49 +02:00
switch ( LOWORD ( wParam ) ) {
case IDOK :
if ( ! PRINTDLG_PS_UpdateDlgStructW ( hDlg , pda ) )
return ( FALSE ) ;
EndDialog ( hDlg , TRUE ) ;
return TRUE ;
case IDCANCEL :
EndDialog ( hDlg , FALSE ) ;
return FALSE ;
case psh3 : {
pda - > pdlg . Flags = 0 ;
pda - > pdlg . hwndOwner = hDlg ;
if ( PrintDlgW ( & ( pda - > pdlg ) ) )
PRINTDLG_PS_ChangePrinterW ( hDlg , pda ) ;
2001-05-05 02:44:03 +02:00
return TRUE ;
}
}
return FALSE ;
}
2005-06-23 18:45:39 +02:00
/***********************************************************************
* DefaultPagePaintHook
* Default hook paint procedure that receives WM_PSD_ * messages from the dialog box
* whenever the sample page is redrawn .
*/
static UINT_PTR
2007-04-06 11:56:15 +02:00
PRINTDLG_DefaultPagePaintHook ( HWND hwndDlg , UINT uMsg , WPARAM wParam , LPARAM lParam ,
const PageSetupDataA * pda )
2005-06-23 18:45:39 +02:00
{
LPRECT lprc = ( LPRECT ) lParam ;
HDC hdc = ( HDC ) wParam ;
HPEN hpen , holdpen ;
LOGFONTW lf ;
HFONT hfont , holdfont ;
INT oldbkmode ;
TRACE ( " uMsg: WM_USER+%d \n " , uMsg - WM_USER ) ;
/* Call user paint hook if enable */
if ( pda - > dlga - > Flags & PSD_ENABLEPAGEPAINTHOOK )
if ( pda - > dlga - > lpfnPagePaintHook ( hwndDlg , uMsg , wParam , lParam ) )
return TRUE ;
switch ( uMsg ) {
/* LPPAGESETUPDLG in lParam */
case WM_PSD_PAGESETUPDLG :
/* Inform about the sample page rectangle */
case WM_PSD_FULLPAGERECT :
/* Inform about the margin rectangle */
case WM_PSD_MINMARGINRECT :
return FALSE ;
/* Draw dashed rectangle showing margins */
case WM_PSD_MARGINRECT :
hpen = CreatePen ( PS_DASH , 1 , GetSysColor ( COLOR_3DSHADOW ) ) ;
holdpen = SelectObject ( hdc , hpen ) ;
Rectangle ( hdc , lprc - > left , lprc - > top , lprc - > right , lprc - > bottom ) ;
DeleteObject ( SelectObject ( hdc , holdpen ) ) ;
return TRUE ;
/* Draw the fake document */
case WM_PSD_GREEKTEXTRECT :
/* select a nice scalable font, because we want the text really small */
SystemParametersInfoW ( SPI_GETICONTITLELOGFONT , sizeof ( lf ) , & lf , 0 ) ;
lf . lfHeight = 6 ; /* value chosen based on visual effect */
hfont = CreateFontIndirectW ( & lf ) ;
holdfont = SelectObject ( hdc , hfont ) ;
/* if text not loaded, then do so now */
if ( wszFakeDocumentText [ 0 ] = = ' \0 ' )
LoadStringW ( COMDLG32_hInstance ,
IDS_FAKEDOCTEXT ,
wszFakeDocumentText ,
sizeof ( wszFakeDocumentText ) / sizeof ( wszFakeDocumentText [ 0 ] ) ) ;
oldbkmode = SetBkMode ( hdc , TRANSPARENT ) ;
DrawTextW ( hdc , wszFakeDocumentText , - 1 , lprc , DT_TOP | DT_LEFT | DT_NOPREFIX | DT_WORDBREAK ) ;
SetBkMode ( hdc , oldbkmode ) ;
DeleteObject ( SelectObject ( hdc , holdfont ) ) ;
return TRUE ;
/* Envelope stamp */
case WM_PSD_ENVSTAMPRECT :
/* Return address */
case WM_PSD_YAFULLPAGERECT :
FIXME ( " envelope/stamp is not implemented \n " ) ;
return FALSE ;
default :
FIXME ( " Unknown message %x \n " , uMsg ) ;
return FALSE ;
}
return TRUE ;
}
/***********************************************************************
* PagePaintProc
* The main paint procedure for the PageSetupDlg function .
* The Page Setup dialog box includes an image of a sample page that shows how
* the user ' s selections affect the appearance of the printed output .
* The image consists of a rectangle that represents the selected paper
* or envelope type , with a dotted - line rectangle representing
* the current margins , and partial ( Greek text ) characters
* to show how text looks on the printed page .
*
* The following messages in the order sends to user hook procedure :
* WM_PSD_PAGESETUPDLG Draw the contents of the sample page
* WM_PSD_FULLPAGERECT Inform about the bounding rectangle
* WM_PSD_MINMARGINRECT Inform about the margin rectangle ( min margin ? )
* WM_PSD_MARGINRECT Draw the margin rectangle
* WM_PSD_GREEKTEXTRECT Draw the Greek text inside the margin rectangle
* If any of first three messages returns TRUE , painting done .
*
* PARAMS :
* hWnd [ in ] Handle to the Page Setup dialog box
* uMsg [ in ] Received message
*
* TODO :
* WM_PSD_ENVSTAMPRECT Draw in the envelope - stamp rectangle ( for envelopes only )
* WM_PSD_YAFULLPAGERECT Draw the return address portion ( for envelopes and other paper sizes )
*
* RETURNS :
* FALSE if all done correctly
*
*/
2005-07-07 20:23:45 +02:00
2005-01-24 12:26:23 +01:00
static LRESULT CALLBACK
2005-06-23 18:45:39 +02:00
PRINTDLG_PagePaintProc ( HWND hWnd , UINT uMsg , WPARAM wParam , LPARAM lParam )
2005-01-24 12:26:23 +01:00
{
2005-06-23 18:45:39 +02:00
PAINTSTRUCT ps ;
RECT rcClient , rcMargin ;
HPEN hpen , holdpen ;
HDC hdc ;
HBRUSH hbrush , holdbrush ;
PageSetupDataA * pda ;
2005-08-25 21:23:43 +02:00
int papersize = 0 , orientation = 0 ; /* FIXME: set this values for user paint hook */
2005-07-07 20:23:45 +02:00
double scalx , scaly ;
2005-06-23 18:45:39 +02:00
# define CALLPAINTHOOK(msg,lprc) PRINTDLG_DefaultPagePaintHook( hWnd, msg, (WPARAM)hdc, (LPARAM)lprc, pda)
if ( uMsg ! = WM_PAINT )
return CallWindowProcA ( lpfnStaticWndProc , hWnd , uMsg , wParam , lParam ) ;
/* Processing WM_PAINT message */
pda = ( PageSetupDataA * ) GetPropA ( hWnd , " __WINE_PAGESETUPDLGDATA " ) ;
if ( ! pda ) {
WARN ( " __WINE_PAGESETUPDLGDATA prop not set? \n " ) ;
return FALSE ;
}
if ( PRINTDLG_DefaultPagePaintHook ( hWnd , WM_PSD_PAGESETUPDLG , MAKELONG ( papersize , orientation ) , ( LPARAM ) pda - > dlga , pda ) )
return FALSE ;
2005-01-24 12:26:23 +01:00
2005-06-23 18:45:39 +02:00
hdc = BeginPaint ( hWnd , & ps ) ;
GetClientRect ( hWnd , & rcClient ) ;
2005-07-07 20:23:45 +02:00
scalx = rcClient . right / ( double ) pda - > curdlg . ptPaperSize . x ;
scaly = rcClient . bottom / ( double ) pda - > curdlg . ptPaperSize . y ;
2005-06-23 18:45:39 +02:00
rcMargin = rcClient ;
2005-07-07 20:23:45 +02:00
rcMargin . left + = ( LONG ) pda - > curdlg . rtMargin . left * scalx ;
rcMargin . top + = ( LONG ) pda - > curdlg . rtMargin . top * scalx ;
rcMargin . right - = ( LONG ) pda - > curdlg . rtMargin . right * scaly ;
rcMargin . bottom - = ( LONG ) pda - > curdlg . rtMargin . bottom * scaly ;
2005-06-23 18:45:39 +02:00
/* if the space is too small then we make sure to not draw anything */
rcMargin . left = min ( rcMargin . left , rcMargin . right ) ;
rcMargin . top = min ( rcMargin . top , rcMargin . bottom ) ;
if ( ! CALLPAINTHOOK ( WM_PSD_FULLPAGERECT , & rcClient ) & &
! CALLPAINTHOOK ( WM_PSD_MINMARGINRECT , & rcMargin ) )
{
2005-01-24 12:26:23 +01:00
/* fill background */
hbrush = GetSysColorBrush ( COLOR_3DHIGHLIGHT ) ;
FillRect ( hdc , & rcClient , hbrush ) ;
holdbrush = SelectObject ( hdc , hbrush ) ;
hpen = CreatePen ( PS_SOLID , 1 , GetSysColor ( COLOR_3DSHADOW ) ) ;
holdpen = SelectObject ( hdc , hpen ) ;
2005-06-23 18:45:39 +02:00
2005-01-24 12:26:23 +01:00
/* paint left edge */
MoveToEx ( hdc , rcClient . left , rcClient . top , NULL ) ;
LineTo ( hdc , rcClient . left , rcClient . bottom - 1 ) ;
/* paint top edge */
MoveToEx ( hdc , rcClient . left , rcClient . top , NULL ) ;
LineTo ( hdc , rcClient . right , rcClient . top ) ;
hpen = CreatePen ( PS_SOLID , 1 , GetSysColor ( COLOR_3DDKSHADOW ) ) ;
DeleteObject ( SelectObject ( hdc , hpen ) ) ;
/* paint right edge */
MoveToEx ( hdc , rcClient . right - 1 , rcClient . top , NULL ) ;
LineTo ( hdc , rcClient . right - 1 , rcClient . bottom ) ;
/* paint bottom edge */
MoveToEx ( hdc , rcClient . left , rcClient . bottom - 1 , NULL ) ;
LineTo ( hdc , rcClient . right , rcClient . bottom - 1 ) ;
2005-06-23 18:45:39 +02:00
DeleteObject ( SelectObject ( hdc , holdpen ) ) ;
DeleteObject ( SelectObject ( hdc , holdbrush ) ) ;
2005-01-24 12:26:23 +01:00
2005-06-23 18:45:39 +02:00
CALLPAINTHOOK ( WM_PSD_MARGINRECT , & rcMargin ) ;
2005-01-24 12:26:23 +01:00
/* give text a bit of a space from the frame */
2005-06-23 18:45:39 +02:00
rcMargin . left + = 2 ;
rcMargin . top + = 2 ;
rcMargin . right - = 2 ;
rcMargin . bottom - = 2 ;
2005-01-24 12:26:23 +01:00
/* if the space is too small then we make sure to not draw anything */
2005-06-23 18:45:39 +02:00
rcMargin . left = min ( rcMargin . left , rcMargin . right ) ;
rcMargin . top = min ( rcMargin . top , rcMargin . bottom ) ;
2005-01-24 12:26:23 +01:00
2005-06-23 18:45:39 +02:00
CALLPAINTHOOK ( WM_PSD_GREEKTEXTRECT , & rcMargin ) ;
2005-01-24 12:26:23 +01:00
}
2005-06-23 18:45:39 +02:00
EndPaint ( hWnd , & ps ) ;
return FALSE ;
# undef CALLPAINTHOOK
2005-01-24 12:26:23 +01:00
}
2005-06-23 18:45:39 +02:00
/***********************************************************************
* PRINTDLG_PageDlgProcA
2005-07-07 20:23:45 +02:00
* Message handler for PageSetupDlgA
2005-06-23 18:45:39 +02:00
*/
2002-10-31 02:04:39 +01:00
static INT_PTR CALLBACK
2005-06-23 18:45:39 +02:00
PRINTDLG_PageDlgProcA ( HWND hDlg , UINT uMsg , WPARAM wParam , LPARAM lParam )
2001-05-05 02:44:03 +02:00
{
2005-07-07 20:23:45 +02:00
DEVMODEA * dm ;
2002-04-11 19:32:49 +02:00
PageSetupDataA * pda ;
2002-10-31 02:04:39 +01:00
INT_PTR res = FALSE ;
2005-07-07 20:23:45 +02:00
HWND hDrawWnd ;
2001-05-05 02:44:03 +02:00
2005-07-07 20:23:45 +02:00
if ( uMsg = = WM_INITDIALOG ) { /*Init dialog*/
2005-06-23 18:45:39 +02:00
pda = ( PageSetupDataA * ) lParam ;
2005-07-07 20:23:45 +02:00
pda - > hDlg = hDlg ; /* saving handle to main window to PageSetupDataA structure */
memcpy ( & pda - > curdlg , pda - > dlga , sizeof ( pda - > curdlg ) ) ;
hDrawWnd = GetDlgItem ( hDlg , rct1 ) ;
2006-10-05 11:11:03 +02:00
TRACE ( " set property to %p \n " , pda ) ;
2005-07-07 20:23:45 +02:00
SetPropA ( hDlg , " __WINE_PAGESETUPDLGDATA " , pda ) ;
SetPropA ( hDrawWnd , " __WINE_PAGESETUPDLGDATA " , pda ) ;
GetWindowRect ( hDrawWnd , & pda - > rtDrawRect ) ; /* Calculating rect in client coordinates where paper draws */
ScreenToClient ( hDlg , ( LPPOINT ) & pda - > rtDrawRect ) ;
ScreenToClient ( hDlg , ( LPPOINT ) ( & pda - > rtDrawRect . right ) ) ;
2005-01-24 12:26:23 +01:00
lpfnStaticWndProc = ( WNDPROC ) SetWindowLongPtrW (
2005-07-07 20:23:45 +02:00
hDrawWnd ,
2005-01-24 12:26:23 +01:00
GWLP_WNDPROC ,
2005-06-23 18:45:39 +02:00
( ULONG_PTR ) PRINTDLG_PagePaintProc ) ;
2005-07-07 20:23:45 +02:00
/* FIXME: Paint hook. Must it be at begin of initializtion or at end? */
2001-05-05 02:44:03 +02:00
res = TRUE ;
if ( pda - > dlga - > Flags & PSD_ENABLEPAGESETUPHOOK ) {
2005-08-25 21:23:43 +02:00
if ( ! pda - > dlga - > lpfnPageSetupHook ( hDlg , uMsg , wParam , ( LPARAM ) pda - > dlga ) )
2001-05-05 02:44:03 +02:00
FIXME ( " Setup page hook failed? \n " ) ;
}
2005-06-23 18:45:39 +02:00
2005-07-07 20:23:45 +02:00
/* if printer button disabled */
2001-05-05 02:44:03 +02:00
if ( pda - > dlga - > Flags & PSD_DISABLEPRINTER )
2002-06-01 01:06:46 +02:00
EnableWindow ( GetDlgItem ( hDlg , psh3 ) , FALSE ) ;
2005-07-07 20:23:45 +02:00
/* if margin edit boxes disabled */
2001-05-05 02:44:03 +02:00
if ( pda - > dlga - > Flags & PSD_DISABLEMARGINS ) {
2002-06-01 01:06:46 +02:00
EnableWindow ( GetDlgItem ( hDlg , edt4 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , edt5 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , edt6 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , edt7 ) , FALSE ) ;
2001-05-05 02:44:03 +02:00
}
2005-08-25 21:23:43 +02:00
/* Set orientation radiobutton properly */
2007-08-23 15:09:08 +02:00
if ( pda - > dlga - > hDevMode )
{
dm = GlobalLock ( pda - > dlga - > hDevMode ) ;
if ( dm - > u1 . s1 . dmOrientation = = DMORIENT_LANDSCAPE )
CheckRadioButton ( hDlg , rad1 , rad2 , rad2 ) ;
else /* this is default if papersize is not set */
CheckRadioButton ( hDlg , rad1 , rad2 , rad1 ) ;
GlobalUnlock ( pda - > dlga - > hDevMode ) ;
}
2005-08-25 21:23:43 +02:00
2005-07-07 20:23:45 +02:00
/* if orientation disabled */
2001-05-05 02:44:03 +02:00
if ( pda - > dlga - > Flags & PSD_DISABLEORIENTATION ) {
EnableWindow ( GetDlgItem ( hDlg , rad1 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , rad2 ) , FALSE ) ;
}
/* We fill them out enabled or not */
if ( pda - > dlga - > Flags & PSD_MARGINS ) {
char str [ 100 ] ;
2002-04-11 19:32:49 +02:00
_c_size2strA ( pda , pda - > dlga - > rtMargin . left , str ) ;
2001-05-05 02:44:03 +02:00
SetDlgItemTextA ( hDlg , edt4 , str ) ;
2002-04-11 19:32:49 +02:00
_c_size2strA ( pda , pda - > dlga - > rtMargin . top , str ) ;
2001-05-05 02:44:03 +02:00
SetDlgItemTextA ( hDlg , edt5 , str ) ;
2002-04-11 19:32:49 +02:00
_c_size2strA ( pda , pda - > dlga - > rtMargin . right , str ) ;
2001-05-05 02:44:03 +02:00
SetDlgItemTextA ( hDlg , edt6 , str ) ;
2002-04-11 19:32:49 +02:00
_c_size2strA ( pda , pda - > dlga - > rtMargin . bottom , str ) ;
2001-05-05 02:44:03 +02:00
SetDlgItemTextA ( hDlg , edt7 , str ) ;
} else {
/* default is 1 inch */
DWORD size = _c_inch2size ( pda - > dlga , 1000 ) ;
char str [ 20 ] ;
2002-04-11 19:32:49 +02:00
_c_size2strA ( pda , size , str ) ;
SetDlgItemTextA ( hDlg , edt4 , str ) ;
SetDlgItemTextA ( hDlg , edt5 , str ) ;
SetDlgItemTextA ( hDlg , edt6 , str ) ;
SetDlgItemTextA ( hDlg , edt7 , str ) ;
2005-07-07 20:23:45 +02:00
pda - > curdlg . rtMargin . left = size ;
pda - > curdlg . rtMargin . top = size ;
pda - > curdlg . rtMargin . right = size ;
pda - > curdlg . rtMargin . bottom = size ;
2002-04-11 19:32:49 +02:00
}
2005-07-07 20:23:45 +02:00
/* if paper disabled */
2002-04-11 19:32:49 +02:00
if ( pda - > dlga - > Flags & PSD_DISABLEPAPER ) {
EnableWindow ( GetDlgItem ( hDlg , cmb2 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , cmb3 ) , FALSE ) ;
}
2005-07-07 20:23:45 +02:00
/* filling combos: printer, paper, source. selecting current printer (from DEVMODEA) */
PRINTDLG_PS_ChangePrinterA ( hDlg , pda ) ;
dm = GlobalLock ( pda - > pdlg . hDevMode ) ;
if ( dm ) {
dm - > dmDefaultSource = 15 ; /*FIXME: Automatic select. Does it always 15 at start? */
PRINTDLG_PaperSizeA ( & ( pda - > pdlg ) , dm - > u1 . s1 . dmPaperSize , & pda - > curdlg . ptPaperSize ) ;
GlobalUnlock ( pda - > pdlg . hDevMode ) ;
pda - > curdlg . ptPaperSize . x = _c_10mm2size ( pda - > dlga , pda - > curdlg . ptPaperSize . x ) ;
pda - > curdlg . ptPaperSize . y = _c_10mm2size ( pda - > dlga , pda - > curdlg . ptPaperSize . y ) ;
2005-08-25 21:23:43 +02:00
if ( IsDlgButtonChecked ( hDlg , rad2 ) = = BST_CHECKED ) { /* Landscape orientation */
DWORD tmp = pda - > curdlg . ptPaperSize . y ;
pda - > curdlg . ptPaperSize . y = pda - > curdlg . ptPaperSize . x ;
pda - > curdlg . ptPaperSize . x = tmp ;
}
2005-07-07 20:23:45 +02:00
} else
2006-10-05 11:11:03 +02:00
WARN ( " GlobalLock(pda->pdlg.hDevMode) fail? hDevMode=%p \n " , pda - > pdlg . hDevMode ) ;
2005-07-07 20:23:45 +02:00
/* Drawing paper prev */
PRINTDLG_PS_ChangePaperPrev ( pda ) ;
2002-04-11 19:32:49 +02:00
return TRUE ;
} else {
pda = ( PageSetupDataA * ) GetPropA ( hDlg , " __WINE_PAGESETUPDLGDATA " ) ;
if ( ! pda ) {
WARN ( " __WINE_PAGESETUPDLGDATA prop not set? \n " ) ;
return FALSE ;
}
if ( pda - > dlga - > Flags & PSD_ENABLEPAGESETUPHOOK ) {
res = pda - > dlga - > lpfnPageSetupHook ( hDlg , uMsg , wParam , lParam ) ;
if ( res ) return res ;
}
}
switch ( uMsg ) {
case WM_COMMAND :
return PRINTDLG_PS_WMCommandA ( hDlg , wParam , lParam , pda ) ;
}
return FALSE ;
}
2002-10-31 02:04:39 +01:00
static INT_PTR CALLBACK
2002-04-11 19:32:49 +02:00
PageDlgProcW ( HWND hDlg , UINT uMsg , WPARAM wParam , LPARAM lParam )
{
2005-10-06 13:38:45 +02:00
static const WCHAR __WINE_PAGESETUPDLGDATA [ ] =
2004-09-22 21:11:05 +02:00
{ ' _ ' , ' _ ' , ' W ' , ' I ' , ' N ' , ' E ' , ' _ ' , ' P ' , ' A ' , ' G ' , ' E ' ,
' S ' , ' E ' , ' T ' , ' U ' , ' P ' , ' D ' , ' L ' , ' G ' , ' D ' , ' A ' , ' T ' , ' A ' , 0 } ;
2002-04-11 19:32:49 +02:00
PageSetupDataW * pda ;
2007-08-04 23:14:20 +02:00
LPDEVMODEW dm ;
2002-04-11 19:32:49 +02:00
BOOL res = FALSE ;
if ( uMsg = = WM_INITDIALOG ) {
res = TRUE ;
pda = ( PageSetupDataW * ) lParam ;
2004-09-22 21:11:05 +02:00
SetPropW ( hDlg , __WINE_PAGESETUPDLGDATA , pda ) ;
2002-04-11 19:32:49 +02:00
if ( pda - > dlga - > Flags & PSD_ENABLEPAGESETUPHOOK ) {
2003-10-14 22:06:46 +02:00
res = pda - > dlga - > lpfnPageSetupHook ( hDlg , uMsg , wParam , ( LPARAM ) pda - > dlga ) ;
2002-04-11 19:32:49 +02:00
if ( ! res ) {
FIXME ( " Setup page hook failed? \n " ) ;
res = TRUE ;
}
}
2005-07-07 20:23:45 +02:00
2002-04-11 19:32:49 +02:00
if ( pda - > dlga - > Flags & PSD_ENABLEPAGEPAINTHOOK ) {
FIXME ( " PagePaintHook not yet implemented! \n " ) ;
}
if ( pda - > dlga - > Flags & PSD_DISABLEPRINTER )
2002-06-01 01:06:46 +02:00
EnableWindow ( GetDlgItem ( hDlg , psh3 ) , FALSE ) ;
2002-04-11 19:32:49 +02:00
if ( pda - > dlga - > Flags & PSD_DISABLEMARGINS ) {
2002-06-01 01:06:46 +02:00
EnableWindow ( GetDlgItem ( hDlg , edt4 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , edt5 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , edt6 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , edt7 ) , FALSE ) ;
2002-04-11 19:32:49 +02:00
}
2007-08-04 23:14:20 +02:00
2007-08-23 15:09:08 +02:00
if ( pda - > dlga - > hDevMode )
{
dm = GlobalLock ( pda - > dlga - > hDevMode ) ;
/* Landscape orientation */
if ( dm - > u1 . s1 . dmOrientation = = DMORIENT_LANDSCAPE )
CheckRadioButton ( hDlg , rad1 , rad2 , rad2 ) ;
else /* this is default if papersize is not set */
CheckRadioButton ( hDlg , rad1 , rad2 , rad1 ) ;
GlobalUnlock ( pda - > dlga - > hDevMode ) ;
}
2002-04-11 19:32:49 +02:00
if ( pda - > dlga - > Flags & PSD_DISABLEORIENTATION ) {
EnableWindow ( GetDlgItem ( hDlg , rad1 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , rad2 ) , FALSE ) ;
}
/* We fill them out enabled or not */
if ( pda - > dlga - > Flags & PSD_MARGINS ) {
2004-09-22 21:11:05 +02:00
WCHAR str [ 100 ] ;
2002-04-11 19:32:49 +02:00
_c_size2strW ( pda , pda - > dlga - > rtMargin . left , str ) ;
2004-09-22 21:11:05 +02:00
SetDlgItemTextW ( hDlg , edt4 , str ) ;
2002-04-11 19:32:49 +02:00
_c_size2strW ( pda , pda - > dlga - > rtMargin . top , str ) ;
2004-09-22 21:11:05 +02:00
SetDlgItemTextW ( hDlg , edt5 , str ) ;
2002-04-11 19:32:49 +02:00
_c_size2strW ( pda , pda - > dlga - > rtMargin . right , str ) ;
2004-09-22 21:11:05 +02:00
SetDlgItemTextW ( hDlg , edt6 , str ) ;
2002-04-11 19:32:49 +02:00
_c_size2strW ( pda , pda - > dlga - > rtMargin . bottom , str ) ;
2004-09-22 21:11:05 +02:00
SetDlgItemTextW ( hDlg , edt7 , str ) ;
2002-04-11 19:32:49 +02:00
} else {
/* default is 1 inch */
DWORD size = _c_inch2size ( ( LPPAGESETUPDLGA ) pda - > dlga , 1000 ) ;
2004-09-22 21:11:05 +02:00
WCHAR str [ 20 ] ;
2002-04-11 19:32:49 +02:00
_c_size2strW ( pda , size , str ) ;
2004-09-22 21:11:05 +02:00
SetDlgItemTextW ( hDlg , edt4 , str ) ;
SetDlgItemTextW ( hDlg , edt5 , str ) ;
SetDlgItemTextW ( hDlg , edt6 , str ) ;
SetDlgItemTextW ( hDlg , edt7 , str ) ;
2001-05-05 02:44:03 +02:00
}
2002-04-11 19:32:49 +02:00
PRINTDLG_PS_ChangePrinterW ( hDlg , pda ) ;
2001-05-05 02:44:03 +02:00
if ( pda - > dlga - > Flags & PSD_DISABLEPAPER ) {
EnableWindow ( GetDlgItem ( hDlg , cmb2 ) , FALSE ) ;
EnableWindow ( GetDlgItem ( hDlg , cmb3 ) , FALSE ) ;
}
2005-07-07 20:23:45 +02:00
2001-05-05 02:44:03 +02:00
return TRUE ;
} else {
2004-09-22 21:11:05 +02:00
pda = ( PageSetupDataW * ) GetPropW ( hDlg , __WINE_PAGESETUPDLGDATA ) ;
2001-05-05 02:44:03 +02:00
if ( ! pda ) {
WARN ( " __WINE_PAGESETUPDLGDATA prop not set? \n " ) ;
return FALSE ;
}
if ( pda - > dlga - > Flags & PSD_ENABLEPAGESETUPHOOK ) {
res = pda - > dlga - > lpfnPageSetupHook ( hDlg , uMsg , wParam , lParam ) ;
if ( res ) return res ;
}
}
switch ( uMsg ) {
case WM_COMMAND :
2002-04-11 19:32:49 +02:00
return PRINTDLG_PS_WMCommandW ( hDlg , wParam , lParam , pda ) ;
2001-05-05 02:44:03 +02:00
}
return FALSE ;
}
2000-05-27 00:26:06 +02:00
/***********************************************************************
2001-06-19 05:34:07 +02:00
* PageSetupDlgA ( COMDLG32 . @ )
2005-06-23 18:45:39 +02:00
*
* Displays the the PAGE SETUP dialog box , which enables the user to specify
* specific properties of a printed page such as
* size , source , orientation and the width of the page margins .
*
* PARAMS
2005-07-07 20:23:45 +02:00
* setupdlg [ IO ] PAGESETUPDLGA struct
2005-06-23 18:45:39 +02:00
*
* RETURNS
* TRUE if the user pressed the OK button
* FALSE if the user cancelled the window or an error occurred
*
* NOTES
* The values of hDevMode and hDevNames are filled on output and can be
* changed in PAGESETUPDLG when they are passed in PageSetupDlg .
2005-07-07 20:23:45 +02:00
*
2000-05-27 00:26:06 +02:00
*/
2005-06-23 18:45:39 +02:00
2000-05-27 00:26:06 +02:00
BOOL WINAPI PageSetupDlgA ( LPPAGESETUPDLGA setupdlg ) {
2001-05-05 02:44:03 +02:00
HGLOBAL hDlgTmpl ;
LPVOID ptr ;
BOOL bRet ;
2002-04-11 19:32:49 +02:00
PageSetupDataA * pda ;
2001-05-05 02:44:03 +02:00
PRINTDLGA pdlg ;
2005-07-07 20:23:45 +02:00
/* TRACE */
2001-05-05 02:44:03 +02:00
if ( TRACE_ON ( commdlg ) ) {
char flagstr [ 1000 ] = " " ;
2006-11-29 11:04:52 +01:00
const struct pd_flags * pflag = psd_flags ;
2001-05-05 02:44:03 +02:00
for ( ; pflag - > name ; pflag + + ) {
if ( setupdlg - > Flags & pflag - > flag ) {
strcat ( flagstr , pflag - > name ) ;
strcat ( flagstr , " | " ) ;
}
}
2002-11-22 00:55:10 +01:00
TRACE ( " (%p): hwndOwner = %p, hDevMode = %p, hDevNames = %p \n "
2006-10-13 15:04:43 +02:00
" hinst %p, flags %08x (%s) \n " ,
2001-05-05 02:44:03 +02:00
setupdlg , setupdlg - > hwndOwner , setupdlg - > hDevMode ,
2002-06-01 01:06:46 +02:00
setupdlg - > hDevNames ,
2001-05-05 02:44:03 +02:00
setupdlg - > hInstance , setupdlg - > Flags , flagstr ) ;
}
2005-07-07 20:23:45 +02:00
/* Checking setupdlg structure */
if ( setupdlg = = NULL ) {
COMDLG32_SetCommDlgExtendedError ( CDERR_INITIALIZATION ) ;
return FALSE ;
}
if ( setupdlg - > lStructSize ! = sizeof ( PAGESETUPDLGA ) ) {
COMDLG32_SetCommDlgExtendedError ( CDERR_STRUCTSIZE ) ;
return FALSE ;
}
if ( ( setupdlg - > Flags & PSD_ENABLEPAGEPAINTHOOK ) & &
( setupdlg - > lpfnPagePaintHook = = NULL ) ) {
2005-06-23 18:45:39 +02:00
COMDLG32_SetCommDlgExtendedError ( CDERR_NOHOOK ) ;
return FALSE ;
}
2001-05-05 02:44:03 +02:00
2006-01-11 12:10:33 +01:00
/* Initialize default printer struct. If no printer device info is specified
retrieve the default printer data . */
2001-05-05 02:44:03 +02:00
memset ( & pdlg , 0 , sizeof ( pdlg ) ) ;
pdlg . lStructSize = sizeof ( pdlg ) ;
2006-01-11 12:10:33 +01:00
if ( setupdlg - > hDevMode & & setupdlg - > hDevNames ) {
pdlg . hDevMode = setupdlg - > hDevMode ;
pdlg . hDevNames = setupdlg - > hDevNames ;
} else {
pdlg . Flags = PD_RETURNDEFAULT ;
bRet = PrintDlgA ( & pdlg ) ;
if ( ! bRet ) {
if ( ! ( setupdlg - > Flags & PSD_NOWARNING ) ) {
char errstr [ 256 ] ;
LoadStringA ( COMDLG32_hInstance , PD32_NO_DEFAULT_PRINTER , errstr , 255 ) ;
MessageBoxA ( setupdlg - > hwndOwner , errstr , 0 , MB_OK | MB_ICONERROR ) ;
}
return FALSE ;
}
2005-07-07 20:23:45 +02:00
}
2006-01-11 12:10:33 +01:00
2001-05-05 02:44:03 +02:00
/* short cut exit, just return default values */
if ( setupdlg - > Flags & PSD_RETURNDEFAULT ) {
2007-08-09 19:10:02 +02:00
DEVMODEA * dm ;
setupdlg - > hDevMode = pdlg . hDevMode ;
setupdlg - > hDevNames = pdlg . hDevNames ;
dm = GlobalLock ( pdlg . hDevMode ) ;
PRINTDLG_PaperSizeA ( & pdlg , dm - > u1 . s1 . dmPaperSize , & setupdlg - > ptPaperSize ) ;
GlobalUnlock ( pdlg . hDevMode ) ;
setupdlg - > ptPaperSize . x = _c_10mm2size ( setupdlg , setupdlg - > ptPaperSize . x ) ;
setupdlg - > ptPaperSize . y = _c_10mm2size ( setupdlg , setupdlg - > ptPaperSize . y ) ;
return TRUE ;
2001-05-05 02:44:03 +02:00
}
2005-07-07 20:23:45 +02:00
/* get dialog template */
2002-04-11 19:32:49 +02:00
hDlgTmpl = PRINTDLG_GetPGSTemplateA ( setupdlg ) ;
2001-05-05 02:44:03 +02:00
if ( ! hDlgTmpl ) {
COMDLG32_SetCommDlgExtendedError ( CDERR_LOADRESFAILURE ) ;
return FALSE ;
}
ptr = LockResource ( hDlgTmpl ) ;
if ( ! ptr ) {
COMDLG32_SetCommDlgExtendedError ( CDERR_LOADRESFAILURE ) ;
return FALSE ;
}
2005-07-07 20:23:45 +02:00
2001-05-05 02:44:03 +02:00
pda = HeapAlloc ( GetProcessHeap ( ) , 0 , sizeof ( * pda ) ) ;
pda - > dlga = setupdlg ;
memcpy ( & pda - > pdlg , & pdlg , sizeof ( pdlg ) ) ;
bRet = ( 0 < DialogBoxIndirectParamA (
setupdlg - > hInstance ,
ptr ,
setupdlg - > hwndOwner ,
2005-06-23 18:45:39 +02:00
PRINTDLG_PageDlgProcA ,
2001-05-05 02:44:03 +02:00
( LPARAM ) pda )
) ;
2005-07-07 20:23:45 +02:00
HeapFree ( GetProcessHeap ( ) , 0 , pda ) ;
2001-05-05 02:44:03 +02:00
return bRet ;
2000-05-27 00:26:06 +02:00
}
/***********************************************************************
2001-06-19 05:34:07 +02:00
* PageSetupDlgW ( COMDLG32 . @ )
2005-11-12 20:12:25 +01:00
*
* See PageSetupDlgA .
2000-05-27 00:26:06 +02:00
*/
BOOL WINAPI PageSetupDlgW ( LPPAGESETUPDLGW setupdlg ) {
2002-04-11 19:32:49 +02:00
HGLOBAL hDlgTmpl ;
LPVOID ptr ;
BOOL bRet ;
PageSetupDataW * pdw ;
PRINTDLGW pdlg ;
2005-07-07 20:23:45 +02:00
2005-06-23 18:45:39 +02:00
FIXME ( " Unicode implementation is not done yet \n " ) ;
2002-04-11 19:32:49 +02:00
if ( TRACE_ON ( commdlg ) ) {
char flagstr [ 1000 ] = " " ;
2006-11-29 11:04:52 +01:00
const struct pd_flags * pflag = psd_flags ;
2002-04-11 19:32:49 +02:00
for ( ; pflag - > name ; pflag + + ) {
if ( setupdlg - > Flags & pflag - > flag ) {
strcat ( flagstr , pflag - > name ) ;
strcat ( flagstr , " | " ) ;
}
}
2002-11-22 00:55:10 +01:00
TRACE ( " (%p): hwndOwner = %p, hDevMode = %p, hDevNames = %p \n "
2006-10-13 15:04:43 +02:00
" hinst %p, flags %08x (%s) \n " ,
2002-04-11 19:32:49 +02:00
setupdlg , setupdlg - > hwndOwner , setupdlg - > hDevMode ,
2002-06-01 01:06:46 +02:00
setupdlg - > hDevNames ,
2002-04-11 19:32:49 +02:00
setupdlg - > hInstance , setupdlg - > Flags , flagstr ) ;
}
2006-01-11 12:10:33 +01:00
/* Initialize default printer struct. If no printer device info is specified
retrieve the default printer data . */
2002-04-11 19:32:49 +02:00
memset ( & pdlg , 0 , sizeof ( pdlg ) ) ;
pdlg . lStructSize = sizeof ( pdlg ) ;
2006-01-11 12:10:33 +01:00
if ( setupdlg - > hDevMode & & setupdlg - > hDevNames ) {
pdlg . hDevMode = setupdlg - > hDevMode ;
pdlg . hDevNames = setupdlg - > hDevNames ;
} else {
pdlg . Flags = PD_RETURNDEFAULT ;
bRet = PrintDlgW ( & pdlg ) ;
if ( ! bRet ) {
if ( ! ( setupdlg - > Flags & PSD_NOWARNING ) ) {
WCHAR errstr [ 256 ] ;
LoadStringW ( COMDLG32_hInstance , PD32_NO_DEFAULT_PRINTER , errstr , 255 ) ;
MessageBoxW ( setupdlg - > hwndOwner , errstr , 0 , MB_OK | MB_ICONERROR ) ;
}
return FALSE ;
}
}
2002-04-11 19:32:49 +02:00
/* short cut exit, just return default values */
if ( setupdlg - > Flags & PSD_RETURNDEFAULT ) {
2004-04-19 22:12:14 +02:00
static const WCHAR a4 [ ] = { ' A ' , ' 4 ' , 0 } ;
2002-04-11 19:32:49 +02:00
setupdlg - > hDevMode = pdlg . hDevMode ;
setupdlg - > hDevNames = pdlg . hDevNames ;
/* FIXME: Just return "A4" for now. */
PRINTDLG_PaperSizeW ( & pdlg , a4 , & setupdlg - > ptPaperSize ) ;
setupdlg - > ptPaperSize . x = _c_10mm2size ( ( LPPAGESETUPDLGA ) setupdlg , setupdlg - > ptPaperSize . x ) ;
setupdlg - > ptPaperSize . y = _c_10mm2size ( ( LPPAGESETUPDLGA ) setupdlg , setupdlg - > ptPaperSize . y ) ;
return TRUE ;
}
hDlgTmpl = PRINTDLG_GetPGSTemplateW ( setupdlg ) ;
if ( ! hDlgTmpl ) {
COMDLG32_SetCommDlgExtendedError ( CDERR_LOADRESFAILURE ) ;
return FALSE ;
}
ptr = LockResource ( hDlgTmpl ) ;
if ( ! ptr ) {
COMDLG32_SetCommDlgExtendedError ( CDERR_LOADRESFAILURE ) ;
2000-05-27 00:26:06 +02:00
return FALSE ;
2002-04-11 19:32:49 +02:00
}
pdw = HeapAlloc ( GetProcessHeap ( ) , 0 , sizeof ( * pdw ) ) ;
pdw - > dlga = setupdlg ;
memcpy ( & pdw - > pdlg , & pdlg , sizeof ( pdlg ) ) ;
bRet = ( 0 < DialogBoxIndirectParamW (
setupdlg - > hInstance ,
ptr ,
setupdlg - > hwndOwner ,
PageDlgProcW ,
( LPARAM ) pdw )
) ;
return bRet ;
2000-05-27 00:26:06 +02:00
}
1999-02-28 21:05:11 +01:00
2000-06-02 21:36:53 +02:00
/***********************************************************************
2001-06-19 05:34:07 +02:00
* PrintDlgExA ( COMDLG32 . @ )
2005-11-12 20:12:25 +01:00
*
* See PrintDlgExW .
*
* FIXME
* Stub
2000-06-02 21:36:53 +02:00
*/
2005-04-18 12:01:07 +02:00
HRESULT WINAPI PrintDlgExA ( LPPRINTDLGEXA lpPrintDlgExA )
2000-06-02 21:36:53 +02:00
{
FIXME ( " stub \n " ) ;
return E_NOTIMPL ;
}
2005-04-18 12:01:07 +02:00
2000-06-02 21:36:53 +02:00
/***********************************************************************
2001-06-19 05:34:07 +02:00
* PrintDlgExW ( COMDLG32 . @ )
2005-11-12 20:12:25 +01:00
*
* Display the the PRINT dialog box , which enables the user to specify
* specific properties of the print job . The property sheet can also have
* additional application - specific and driver - specific property pages .
*
* PARAMS
* lppd [ IO ] ptr to PRINTDLGEX struct
*
* RETURNS
* Success : S_OK
* Failure : One of the following COM error codes :
* E_OUTOFMEMORY Insufficient memory .
* E_INVALIDARG One or more arguments are invalid .
* E_POINTER Invalid pointer .
* E_HANDLE Invalid handle .
* E_FAIL Unspecified error .
*
* FIXME
* Stub
2000-06-02 21:36:53 +02:00
*/
2005-04-18 12:01:07 +02:00
HRESULT WINAPI PrintDlgExW ( LPPRINTDLGEXW lpPrintDlgExW )
2000-06-02 21:36:53 +02:00
{
FIXME ( " stub \n " ) ;
return E_NOTIMPL ;
}