Implemented PrintDlgW and PageSetupDlgW.
diff --git a/dlls/commdlg/printdlg.c b/dlls/commdlg/printdlg.c
index 9a57a86..e5b7968 100644
--- a/dlls/commdlg/printdlg.c
+++ b/dlls/commdlg/printdlg.c
@@ -62,6 +62,22 @@
HWND hwndUpDown;
} PRINT_PTRA;
+typedef struct
+{
+ LPDEVMODEW lpDevMode;
+ struct {
+ LPPRINTDLGW lpPrintDlg;
+ } dlg;
+ LPPRINTER_INFO_2W lpPrinterInfo;
+ LPDRIVER_INFO_3W lpDriverInfo;
+ UINT HelpMessageID;
+ HICON hCollateIcon; /* PrintDlg only */
+ HICON hNoCollateIcon; /* PrintDlg only */
+ HICON hPortraitIcon; /* PrintSetupDlg only */
+ HICON hLandscapeIcon; /* PrintSetupDlg only */
+ HWND hwndUpDown;
+} PRINT_PTRW;
+
/* Debugging info */
static struct pd_flags {
DWORD flag;
@@ -126,7 +142,7 @@
*
* Returns TRUE on success else FALSE
*/
-static BOOL PRINTDLG_GetDefaultPrinterName(LPSTR buf, DWORD len)
+static BOOL PRINTDLG_GetDefaultPrinterNameA(LPSTR buf, DWORD len)
{
char *ptr;
@@ -142,6 +158,27 @@
return TRUE;
}
+static BOOL PRINTDLG_GetDefaultPrinterNameW(LPWSTR buf, DWORD len)
+{
+ LPSTR ptr, bufA = (LPSTR)HeapAlloc(GetProcessHeap(),0,len+1);
+
+
+ if(!GetProfileStringA("windows", "device", "", bufA, len)) {
+ TRACE("No profile entry for default printer found.\n");
+ HeapFree(GetProcessHeap(),0,bufA);
+ return FALSE;
+ }
+ if((ptr = strchr(bufA, ',')) == NULL) {
+ FIXME("bad format for default printer (%s)!\n",bufA);
+ HeapFree(GetProcessHeap(),0,bufA);
+ return FALSE;
+ }
+ *ptr = '\0';
+ MultiByteToWideChar( CP_ACP, 0, bufA, -1, buf, len );
+ HeapFree(GetProcessHeap(),0,bufA);
+ return TRUE;
+}
+
/***********************************************************************
* PRINTDLG_OpenDefaultPrinter
*
@@ -154,7 +191,7 @@
{
char buf[260];
BOOL res;
- if(!PRINTDLG_GetDefaultPrinterName(buf, sizeof(buf)))
+ if(!PRINTDLG_GetDefaultPrinterNameA(buf, sizeof(buf)))
return FALSE;
res = OpenPrinterA(buf, hprn, NULL);
if (!res)
@@ -175,7 +212,7 @@
*
* Returns number of printers added to list.
*/
-static INT PRINTDLG_SetUpPrinterListCombo(HWND hDlg, UINT id, LPCSTR name)
+static INT PRINTDLG_SetUpPrinterListComboA(HWND hDlg, UINT id, LPCSTR name)
{
DWORD needed, num;
INT i;
@@ -197,7 +234,7 @@
char buf[260];
FIXME("Can't find '%s' in printer list so trying to find default\n",
name);
- if(!PRINTDLG_GetDefaultPrinterName(buf, sizeof(buf)))
+ if(!PRINTDLG_GetDefaultPrinterNameA(buf, sizeof(buf)))
return num;
i = SendDlgItemMessageA(hDlg, id, CB_FINDSTRINGEXACT, -1, (LPARAM)buf);
if(i == CB_ERR)
@@ -207,6 +244,39 @@
return num;
}
+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);
+ EnumPrintersW(PRINTER_ENUM_LOCAL, NULL, 2, (LPBYTE)pi, needed, &needed,
+ &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) {
+
+ /* ansi is ok */
+ char buf[260];
+ FIXME("Can't find '%s' in printer list so trying to find default\n",
+ debugstr_w(name));
+ if(!PRINTDLG_GetDefaultPrinterNameA(buf, sizeof(buf)))
+ return num;
+ i = SendDlgItemMessageA(hDlg, id, CB_FINDSTRINGEXACT, -1, (LPARAM)buf);
+ if(i == CB_ERR)
+ FIXME("Can't find default printer in printer list\n");
+ }
+ SendDlgItemMessageW(hDlg, id, CB_SETCURSEL, i, 0);
+ return num;
+}
+
/***********************************************************************
* PRINTDLG_CreateDevNames [internal]
*
@@ -251,12 +321,57 @@
strcpy(pTempPtr, OutputPort);
lpDevNames->wOutputOffset = pTempPtr - pDevNamesSpace;
- PRINTDLG_GetDefaultPrinterName(buf, sizeof(buf));
+ PRINTDLG_GetDefaultPrinterNameA(buf, sizeof(buf));
lpDevNames->wDefault = (strcmp(buf, DeviceName) == 0) ? 1 : 0;
GlobalUnlock(*hmem);
return TRUE;
}
+static BOOL PRINTDLG_CreateDevNamesW(HGLOBAL *hmem, LPCWSTR DeviceDriverName,
+ LPCWSTR DeviceName, LPCWSTR OutputPort)
+{
+ long size;
+ LPWSTR pDevNamesSpace;
+ LPWSTR pTempPtr;
+ LPDEVNAMES lpDevNames;
+ WCHAR bufW[260];
+ char buf[260];
+
+ size = sizeof(WCHAR)*lstrlenW(DeviceDriverName) + 2
+ + sizeof(WCHAR)*lstrlenW(DeviceName) + 2
+ + sizeof(WCHAR)*lstrlenW(OutputPort) + 2
+ + sizeof(DEVNAMES);
+
+ 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;
+
+ pTempPtr += lstrlenW(DeviceName) + 1;
+ lstrcpyW(pTempPtr, OutputPort);
+ lpDevNames->wOutputOffset = pTempPtr - pDevNamesSpace;
+
+ PRINTDLG_GetDefaultPrinterNameA(buf, sizeof(buf));
+ MultiByteToWideChar(CP_ACP, 0, buf, -1, bufW, -1);
+ lpDevNames->wDefault = (lstrcmpW(bufW, DeviceName) == 0) ? 1 : 0;
+ GlobalUnlock(*hmem);
+ return TRUE;
+}
+
+
static BOOL PRINTDLG_CreateDevNames16(HGLOBAL16 *hmem, char* DeviceDriverName,
char* DeviceName, char* OutputPort)
{
@@ -293,7 +408,7 @@
strcpy(pTempPtr, OutputPort);
lpDevNames->wOutputOffset = pTempPtr - pDevNamesSpace;
- PRINTDLG_GetDefaultPrinterName(buf, sizeof(buf));
+ PRINTDLG_GetDefaultPrinterNameA(buf, sizeof(buf));
lpDevNames->wDefault = (strcmp(buf, DeviceName) == 0) ? 1 : 0;
GlobalUnlock16(*hmem);
return TRUE;
@@ -310,7 +425,7 @@
* FALSE if user is not allowed to close (i.e. wrong nTo or nFrom values)
* TRUE if succesful.
*/
-static BOOL PRINTDLG_UpdatePrintDlg(HWND hDlg,
+static BOOL PRINTDLG_UpdatePrintDlgA(HWND hDlg,
PRINT_PTRA* PrintStructures)
{
LPPRINTDLGA lppd = PrintStructures->dlg.lpPrintDlg;
@@ -384,7 +499,82 @@
return TRUE;
}
-static BOOL PRINTDLG_PaperSize(
+static BOOL PRINTDLG_UpdatePrintDlgW(HWND hDlg,
+ PRINT_PTRW* PrintStructures)
+{
+ LPPRINTDLGW lppd = PrintStructures->dlg.lpPrintDlg;
+ 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) {
+ char resourcestr[256];
+ char resultstr[256];
+ LoadStringA(COMDLG32_hInstance, PD32_INVALID_PAGE_RANGE,
+ resourcestr, 255);
+ sprintf(resultstr,resourcestr, lppd->nMinPage, lppd->nMaxPage);
+ LoadStringA(COMDLG32_hInstance, PD32_PRINT_TITLE,
+ resourcestr, 255);
+ MessageBoxA(hDlg, resultstr, resourcestr,
+ MB_OK | MB_ICONWARNING);
+ return FALSE;
+ }
+ lppd->nFromPage = nFromPage;
+ lppd->nToPage = nToPage;
+ }
+
+ 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)
+ lpdm->dmCollate =
+ (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(
PRINTDLGA *pdlga,const char *PaperSize,LPPOINT size
) {
DEVNAMES *dn;
@@ -433,7 +623,64 @@
/* this is _10ths_ of a millimeter */
size->x=points[i].x;
size->y=points[i].y;
- FIXME("papersize is %ld x %ld\n",size->x,size->y);
+ retval = TRUE;
+out:
+ GlobalUnlock(pdlga->hDevNames);
+ GlobalUnlock(pdlga->hDevMode);
+ if (Names) HeapFree(GetProcessHeap(),0,Names);
+ if (points) HeapFree(GetProcessHeap(),0,points);
+ 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;
+
+ 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;
+ }
+
+ Names = (WCHAR*)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*NrOfEntries*64);
+ 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;
retval = TRUE;
out:
GlobalUnlock(pdlga->hDevNames);
@@ -451,7 +698,7 @@
* dialog. We store the associated word (eg DMPAPER_A4) as the item data.
* We also try to re-select the old selection.
*/
-static BOOL PRINTDLG_SetUpPaperComboBox(HWND hDlg,
+static BOOL PRINTDLG_SetUpPaperComboBoxA(HWND hDlg,
int nIDComboBox,
char* PrinterName,
char* PortName,
@@ -526,7 +773,7 @@
NrOfEntries = 0;
}
- Names = HeapAlloc(GetProcessHeap(),0, NrOfEntries*NamesSize);
+ Names = HeapAlloc(GetProcessHeap(),0, NrOfEntries*sizeof(char)*NamesSize);
Words = HeapAlloc(GetProcessHeap(),0, NrOfEntries*sizeof(WORD));
NrOfEntries = DeviceCapabilitiesA(PrinterName, PortName,
fwCapability_Names, Names, dm);
@@ -561,10 +808,121 @@
return TRUE;
}
+static BOOL PRINTDLG_SetUpPaperComboBoxW(HWND hDlg,
+ int nIDComboBox,
+ WCHAR* PrinterName,
+ WCHAR* PortName,
+ LPDEVMODEW dm)
+{
+ int i;
+ int NrOfEntries;
+ WCHAR* Names;
+ WORD* Words;
+ DWORD Sel;
+ WORD oldWord = 0;
+ int NamesSize;
+ int fwCapability_Names;
+ int fwCapability_Words;
+
+ TRACE(" Printer: %s, Port: %s, ComboID: %d\n",debugstr_w(PrinterName),debugstr_w(PortName),nIDComboBox);
+
+ /* query the dialog box for the current selected value */
+ Sel = SendDlgItemMessageA(hDlg, nIDComboBox, CB_GETCURSEL, 0, 0);
+ 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.
+ */
+ 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;
+ }
+ }
+
+ 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;
+ }
+
+ /* for some printer drivers, DeviceCapabilities calls a VXD to obtain the
+ * 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 */
+ SendDlgItemMessageA(hDlg, nIDComboBox, CB_RESETCONTENT, 0, 0);
+
+ /* store new content */
+ for (i = 0; i < NrOfEntries; i++) {
+ DWORD pos = SendDlgItemMessageW(hDlg, nIDComboBox, CB_ADDSTRING, 0,
+ (LPARAM)(&Names[i*NamesSize]) );
+ SendDlgItemMessageW(hDlg, nIDComboBox, CB_SETITEMDATA, pos,
+ 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++) {
+ if(SendDlgItemMessageA(hDlg, nIDComboBox, CB_GETITEMDATA, i, 0) ==
+ oldWord) {
+ Sel = i;
+ break;
+ }
+ }
+ SendDlgItemMessageA(hDlg, nIDComboBox, CB_SETCURSEL, Sel, 0);
+
+ HeapFree(GetProcessHeap(),0,Words);
+ HeapFree(GetProcessHeap(),0,Names);
+ return TRUE;
+}
+
+
/***********************************************************************
* PRINTDLG_UpdatePrinterInfoTexts [internal]
*/
-static void PRINTDLG_UpdatePrinterInfoTexts(HWND hDlg, LPPRINTER_INFO_2A pi)
+static void PRINTDLG_UpdatePrinterInfoTextsA(HWND hDlg, LPPRINTER_INFO_2A pi)
{
char StatusMsg[256];
char ResourceString[256];
@@ -601,13 +959,50 @@
return;
}
+static void PRINTDLG_UpdatePrinterInfoTextsW(HWND hDlg, LPPRINTER_INFO_2W pi)
+{
+ WCHAR StatusMsg[256];
+ WCHAR ResourceString[256];
+ int i;
+
+ /* Status Message */
+ StatusMsg[0]='\0';
+
+ /* add all status messages */
+ for (i = 0; i < 25; i++) {
+ if (pi->Status & (1<<i)) {
+ LoadStringW(COMDLG32_hInstance, PD32_PRINTER_STATUS_PAUSED+i,
+ ResourceString, 255);
+ lstrcatW(StatusMsg,ResourceString);
+ }
+ }
+ /* append "ready" */
+ /* FIXME: status==ready must only be appended if really so.
+ but how to detect? */
+ LoadStringW(COMDLG32_hInstance, PD32_PRINTER_STATUS_READY,
+ ResourceString, 255);
+ lstrcatW(StatusMsg,ResourceString);
+
+ SendDlgItemMessageW(hDlg, stc12, WM_SETTEXT, 0, (LPARAM)StatusMsg);
+
+ /* set all other printer info texts */
+ SendDlgItemMessageW(hDlg, stc11, WM_SETTEXT, 0, (LPARAM)pi->pDriverName);
+ if (pi->pLocation != NULL && pi->pLocation[0] != '\0')
+ SendDlgItemMessageW(hDlg, stc14, WM_SETTEXT, 0,(LPARAM)pi->pLocation);
+ else
+ SendDlgItemMessageW(hDlg, stc14, WM_SETTEXT, 0,(LPARAM)pi->pPortName);
+ SendDlgItemMessageW(hDlg, stc13, WM_SETTEXT, 0, (LPARAM)(pi->pComment ?
+ pi->pComment : (LPCWSTR)"\0\0"));
+ return;
+}
+
/*******************************************************************
*
* PRINTDLG_ChangePrinter
*
*/
-static BOOL PRINTDLG_ChangePrinter(HWND hDlg, char *name,
+static BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name,
PRINT_PTRA *PrintStructures)
{
LPPRINTDLGA lppd = PrintStructures->dlg.lpPrintDlg;
@@ -637,7 +1032,7 @@
}
ClosePrinter(hprn);
- PRINTDLG_UpdatePrinterInfoTexts(hDlg, PrintStructures->lpPrinterInfo);
+ PRINTDLG_UpdatePrinterInfoTextsA(hDlg, PrintStructures->lpPrinterInfo);
if(PrintStructures->lpDevMode) {
HeapFree(GetProcessHeap(), 0, PrintStructures->lpDevMode);
@@ -746,11 +1141,174 @@
} else { /* PD_PRINTSETUP */
BOOL bPortrait = (lpdm->u1.s1.dmOrientation == DMORIENT_PORTRAIT);
- PRINTDLG_SetUpPaperComboBox(hDlg, cmb2,
+ PRINTDLG_SetUpPaperComboBoxA(hDlg, cmb2,
PrintStructures->lpPrinterInfo->pPrinterName,
PrintStructures->lpPrinterInfo->pPortName,
lpdm);
- PRINTDLG_SetUpPaperComboBox(hDlg, cmb3,
+ 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));
+
+ }
+
+ /* help button */
+ if ((lppd->Flags & PD_SHOWHELP)==0) {
+ /* hide if PD_SHOWHELP not specified */
+ ShowWindow(GetDlgItem(hDlg, pshHelp), SW_HIDE);
+ }
+ return TRUE;
+}
+
+static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name,
+ PRINT_PTRW *PrintStructures)
+{
+ LPPRINTDLGW lppd = PrintStructures->dlg.lpPrintDlg;
+ LPDEVMODEW lpdm = NULL;
+ LONG dmSize;
+ DWORD needed;
+ HANDLE hprn;
+
+ if(PrintStructures->lpPrinterInfo)
+ HeapFree(GetProcessHeap(),0, PrintStructures->lpPrinterInfo);
+ if(PrintStructures->lpDriverInfo)
+ HeapFree(GetProcessHeap(),0, PrintStructures->lpDriverInfo);
+ 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);
+
+ if(PrintStructures->lpDevMode) {
+ HeapFree(GetProcessHeap(), 0, PrintStructures->lpDevMode);
+ PrintStructures->lpDevMode = NULL;
+ }
+
+ 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);
+ }
+ /* "All xxx pages"... */
+ {
+ /* ansi is ok */
+ char resourcestr[64];
+ char result[64];
+ LoadStringA(COMDLG32_hInstance, PD32_PRINT_ALL_X_PAGES,
+ resourcestr, 49);
+ sprintf(result,resourcestr,lppd->nMaxPage - lppd->nMinPage + 1);
+ SendDlgItemMessageA(hDlg, rad1, WM_SETTEXT, 0, (LPARAM) result);
+ }
+
+ /* Collate pages
+ *
+ * FIXME: The ico3 is not displayed for some reason. I don't know why.
+ */
+ if (lppd->Flags & PD_COLLATE) {
+ SendDlgItemMessageA(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+ (LPARAM)PrintStructures->hCollateIcon);
+ CheckDlgButton(hDlg, chx2, 1);
+ } else {
+ SendDlgItemMessageA(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+ (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)) {
+ EnableWindow(GetDlgItem(hDlg, chx2), FALSE);
+ EnableWindow(GetDlgItem(hDlg, ico3), FALSE);
+ }
+ }
+
+ /* 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)) {
+ EnableWindow(GetDlgItem(hDlg, edt3), FALSE);
+ EnableWindow(GetDlgItem(hDlg, stc5), FALSE);
+ }
+ }
+
+ /* print to file */
+ CheckDlgButton(hDlg, chx1, (lppd->Flags & PD_PRINTTOFILE) ? 1 : 0);
+ if (lppd->Flags & PD_DISABLEPRINTTOFILE)
+ EnableWindow(GetDlgItem(hDlg, chx1), FALSE);
+ 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,
+ PrintStructures->lpPrinterInfo->pPrinterName,
+ PrintStructures->lpPrinterInfo->pPortName,
+ lpdm);
+ PRINTDLG_SetUpPaperComboBoxW(hDlg, cmb3,
PrintStructures->lpPrinterInfo->pPrinterName,
PrintStructures->lpPrinterInfo->pPortName,
lpdm);
@@ -853,28 +1411,133 @@
name = (char*)pdn + pdn->wDeviceOffset;
else if(pdm)
name = pdm->dmDeviceName;
- PRINTDLG_SetUpPrinterListCombo(hDlg, comboID, name);
+ PRINTDLG_SetUpPrinterListComboA(hDlg, comboID, name);
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))
- PRINTDLG_ChangePrinter(hDlg, name, PrintStructures);
+ PRINTDLG_ChangePrinterA(hDlg, name, PrintStructures);
HeapFree(GetProcessHeap(),0,name);
} else {
/* else use default printer */
char name[200];
- BOOL ret = PRINTDLG_GetDefaultPrinterName(name, sizeof(name));
+ BOOL ret = PRINTDLG_GetDefaultPrinterNameA(name, sizeof(name));
if (ret)
- PRINTDLG_ChangePrinter(hDlg, name, PrintStructures);
+ 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)
+{
+ LPPRINTDLGW lppd = PrintStructures->dlg.lpPrintDlg;
+ 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 =
+ LoadImageA(COMDLG32_hInstance, "PD32_COLLATE", IMAGE_ICON, 0, 0, 0);
+ PrintStructures->hNoCollateIcon =
+ LoadImageA(COMDLG32_hInstance, "PD32_NOCOLLATE", IMAGE_ICON, 0, 0, 0);
+
+ /* These can be done with LoadIcon */
+ PrintStructures->hPortraitIcon =
+ LoadIconA(COMDLG32_hInstance, "PD32_PORTRAIT");
+ PrintStructures->hLandscapeIcon =
+ LoadIconA(COMDLG32_hInstance, "PD32_LANDSCAPE");
+
+ 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) {
+ if((PrintStructures->HelpMessageID =
+ RegisterWindowMessageA(HELPMSGSTRINGA)) == 0) {
+ 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;
+ if (lppd->nMinPage == lppd->nMaxPage)
+ lppd->Flags |= PD_NOPAGENUMS;
+ 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)) {
+ /* Fill Combobox
+ */
+ 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];
+ BOOL ret = PRINTDLG_GetDefaultPrinterNameW(name, sizeof(name));
+
+ if (ret)
+ PRINTDLG_ChangePrinterW(hDlg, name, PrintStructures);
+ else
+ FIXME("No default printer found, expect problems!\n");
+ }
+ return TRUE;
+}
+
+
/***********************************************************************
* PRINTDLG_WMInitDialog [internal]
*/
@@ -968,21 +1631,21 @@
name = (char*)pdn + pdn->wDeviceOffset;
else if(pdm)
name = pdm->dmDeviceName;
- PRINTDLG_SetUpPrinterListCombo(hDlg, comboID, name);
+ PRINTDLG_SetUpPrinterListComboA(hDlg, comboID, name);
if(pdm) GlobalUnlock16(lppd->hDevMode);
if(pdn) GlobalUnlock16(lppd->hDevNames);
/* Now find selected printer and update rest of dlg */
name = HeapAlloc(GetProcessHeap(),0,256);
if (GetDlgItemTextA(hDlg, comboID, name, 255))
- PRINTDLG_ChangePrinter(hDlg, name, PrintStructures);
+ PRINTDLG_ChangePrinterA(hDlg, name, PrintStructures);
} else {
/* else just use default printer */
char name[200];
- BOOL ret = PRINTDLG_GetDefaultPrinterName(name, sizeof(name));
+ BOOL ret = PRINTDLG_GetDefaultPrinterNameA(name, sizeof(name));
if (ret)
- PRINTDLG_ChangePrinter(hDlg, name, PrintStructures);
+ PRINTDLG_ChangePrinterA(hDlg, name, PrintStructures);
else
FIXME("No default printer found, expect problems!\n");
}
@@ -994,7 +1657,7 @@
/***********************************************************************
* PRINTDLG_WMCommand [internal]
*/
-static LRESULT PRINTDLG_WMCommand(HWND hDlg, WPARAM wParam,
+static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam,
LPARAM lParam, PRINT_PTRA* PrintStructures)
{
LPPRINTDLGA lppd = PrintStructures->dlg.lpPrintDlg;
@@ -1004,7 +1667,7 @@
switch (LOWORD(wParam)) {
case IDOK:
TRACE(" OK button was hit\n");
- if (PRINTDLG_UpdatePrintDlg(hDlg, PrintStructures)!=TRUE) {
+ if (PRINTDLG_UpdatePrintDlgA(hDlg, PrintStructures)!=TRUE) {
FIXME("Update printdlg was not successful!\n");
return(FALSE);
}
@@ -1114,7 +1777,7 @@
if (HIWORD(wParam)==CBN_SELCHANGE) {
char PrinterName[256];
GetDlgItemTextA(hDlg, LOWORD(wParam), PrinterName, 255);
- PRINTDLG_ChangePrinter(hDlg, PrinterName, PrintStructures);
+ PRINTDLG_ChangePrinterA(hDlg, PrinterName, PrintStructures);
}
break;
@@ -1169,6 +1832,170 @@
return FALSE;
}
+static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam,
+ LPARAM lParam, PRINT_PTRW* PrintStructures)
+{
+ LPPRINTDLGW lppd = PrintStructures->dlg.lpPrintDlg;
+ UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4;
+ LPDEVMODEW lpdm = PrintStructures->lpDevMode;
+
+ switch (LOWORD(wParam)) {
+ case IDOK:
+ TRACE(" OK button was hit\n");
+ if (PRINTDLG_UpdatePrintDlgW(hDlg, PrintStructures)!=TRUE) {
+ 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");
+ SendMessageW(lppd->hwndOwner, PrintStructures->HelpMessageID,
+ (WPARAM) hDlg, (LPARAM) lppd);
+ break;
+
+ case chx2: /* collate pages checkbox */
+ if (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED)
+ SendDlgItemMessageA(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+ (LPARAM)PrintStructures->hCollateIcon);
+ else
+ SendDlgItemMessageA(hDlg, ico3, STM_SETIMAGE, (WPARAM) IMAGE_ICON,
+ (LPARAM)PrintStructures->hNoCollateIcon);
+ break;
+ 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
+ EnableWindow(GetDlgItem(hDlg, chx2), TRUE);
+ }
+ break;
+
+ 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];
+
+ GetDlgItemTextW(hDlg, PrinterComboID, PrinterName, 255);
+ if (!OpenPrinterW(PrinterName, &hPrinter, NULL)) {
+ FIXME(" Call to OpenPrinter did not succeed!\n");
+ break;
+ }
+ DocumentPropertiesW(hDlg, hPrinter, PrinterName,
+ 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;
+
+ 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;
+
+ case cmb1: /* Printer Combobox in PRINT SETUP, quality combobox in PRINT */
+ if (PrinterComboID != wParam) {
+ FIXME("No handling for print quality combo box yet.\n");
+ break;
+ }
+ /* FALLTHROUGH */
+ case cmb4: /* Printer combobox */
+ if (HIWORD(wParam)==CBN_SELCHANGE) {
+ WCHAR PrinterName[256];
+ GetDlgItemTextW(hDlg, LOWORD(wParam), PrinterName, 255);
+ PRINTDLG_ChangePrinterW(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 = SendDlgItemMessageW(hDlg, cmb3,
+ CB_GETITEMDATA, Sel,
+ 0);
+ }
+ break;
+ }
+ 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;
+}
+
/***********************************************************************
* PrintDlgProcA [internal]
*/
@@ -1202,7 +2029,51 @@
switch (uMsg) {
case WM_COMMAND:
- return PRINTDLG_WMCommand(hDlg, wParam, lParam, PrintStructures);
+ 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;
+ }
+ return res;
+}
+
+BOOL WINAPI PrintDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam,
+ LPARAM lParam)
+{
+ PRINT_PTRW* PrintStructures;
+ LRESULT res=FALSE;
+
+ if (uMsg!=WM_INITDIALOG) {
+ PrintStructures = (PRINT_PTRW*) GetWindowLongA(hDlg, DWL_USER);
+ if (!PrintStructures)
+ return FALSE;
+ } else {
+ PrintStructures = (PRINT_PTRW*) lParam;
+ SetWindowLongA(hDlg, DWL_USER, lParam);
+ res = PRINTDLG_WMInitDialogW(hDlg, wParam, PrintStructures);
+
+ if(PrintStructures->dlg.lpPrintDlg->Flags & PD_ENABLEPRINTHOOK)
+ res = PrintStructures->dlg.lpPrintDlg->lpfnPrintHook(
+ hDlg, uMsg, wParam, (LPARAM)PrintStructures->dlg.lpPrintDlg
+ );
+ return res;
+ }
+
+ if(PrintStructures->dlg.lpPrintDlg->Flags & PD_ENABLEPRINTHOOK) {
+ res = PrintStructures->dlg.lpPrintDlg->lpfnPrintHook(hDlg,uMsg,wParam,
+ lParam);
+ if(res) return res;
+ }
+
+ switch (uMsg) {
+ case WM_COMMAND:
+ return PRINTDLG_WMCommandW(hDlg, wParam, lParam, PrintStructures);
case WM_DESTROY:
DestroyIcon(PrintStructures->hCollateIcon);
@@ -1269,7 +2140,7 @@
* PRINTDLG_GetDlgTemplate
*
*/
-static HGLOBAL PRINTDLG_GetDlgTemplate(PRINTDLGA *lppd)
+static HGLOBAL PRINTDLG_GetDlgTemplateA(PRINTDLGA *lppd)
{
HGLOBAL hDlgTmpl, hResInfo;
@@ -1302,6 +2173,40 @@
return hDlgTmpl;
}
+static HGLOBAL PRINTDLG_GetDlgTemplateW(PRINTDLGW *lppd)
+{
+ HGLOBAL hDlgTmpl, hResInfo;
+ const WCHAR xpsetup[] = { 'P','R','I','N','T','3','2','_','S','E','T','U','P',0};
+ const WCHAR xprint[] = { 'P','R','I','N','T','3','2',0};
+
+ if (lppd->Flags & PD_PRINTSETUP) {
+ if(lppd->Flags & PD_ENABLESETUPTEMPLATEHANDLE) {
+ hDlgTmpl = lppd->hSetupTemplate;
+ } else if(lppd->Flags & PD_ENABLESETUPTEMPLATE) {
+ hResInfo = FindResourceW(lppd->hInstance,
+ lppd->lpSetupTemplateName, RT_DIALOGW);
+ hDlgTmpl = LoadResource(lppd->hInstance, hResInfo);
+ } else {
+ hResInfo = FindResourceW(COMDLG32_hInstance, xpsetup, RT_DIALOGW);
+ 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,
+ RT_DIALOGW);
+ hDlgTmpl = LoadResource(lppd->hInstance, hResInfo);
+ } else {
+ hResInfo = FindResourceW(COMDLG32_hInstance, xprint, RT_DIALOGW);
+ hDlgTmpl = LoadResource(COMDLG32_hInstance, hResInfo);
+ }
+ }
+ return hDlgTmpl;
+}
+
+
/************************************************************
*
@@ -1342,7 +2247,7 @@
* PRINTDLG_CreateDC
*
*/
-static BOOL PRINTDLG_CreateDC(LPPRINTDLGA lppd)
+static BOOL PRINTDLG_CreateDCA(LPPRINTDLGA lppd)
{
DEVNAMES *pdn = GlobalLock(lppd->hDevNames);
DEVMODEA *pdm = GlobalLock(lppd->hDevMode);
@@ -1363,6 +2268,27 @@
return lppd->hDC ? TRUE : FALSE;
}
+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;
+}
+
static BOOL PRINTDLG_CreateDC16(LPPRINTDLG16 lppd)
{
DEVNAMES *pdn = GlobalLock16(lppd->hDevNames);
@@ -1404,6 +2330,7 @@
* * Settings are not yet taken from a provided DevMode or
* default printer settings.
*/
+
BOOL WINAPI PrintDlgA(
LPPRINTDLGA lppd /* [in/out] ptr to PRINTDLG32 struct */
)
@@ -1483,7 +2410,7 @@
/* load Dialog resources,
* depending on Flags indicates Print32 or Print32_setup dialog
*/
- hDlgTmpl = PRINTDLG_GetDlgTemplate(lppd);
+ hDlgTmpl = PRINTDLG_GetDlgTemplateA(lppd);
if (!hDlgTmpl) {
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
return FALSE;
@@ -1551,7 +2478,163 @@
HeapFree(GetProcessHeap(), 0, PrintStructures);
}
if(bRet && (lppd->Flags & PD_RETURNDC || lppd->Flags & PD_RETURNIC))
- bRet = PRINTDLG_CreateDC(lppd);
+ bRet = PRINTDLG_CreateDCA(lppd);
+
+ TRACE("exit! (%d)\n", bRet);
+ return bRet;
+}
+
+/***********************************************************************
+ * PrintDlgW (COMDLG32.@)
+ */
+BOOL WINAPI PrintDlgW(
+ LPPRINTDLGW lppd /* [in/out] ptr to PRINTDLG32 struct */
+ )
+{
+ BOOL bRet = FALSE;
+ LPVOID ptr;
+ HINSTANCE hInst = GetWindowLongA( lppd->hwndOwner, GWL_HINSTANCE );
+
+ if(TRACE_ON(commdlg)) {
+ char flagstr[1000] = "";
+ struct pd_flags *pflag = pd_flags;
+ for( ; pflag->name; pflag++) {
+ if(lppd->Flags & pflag->flag)
+ strcat(flagstr, pflag->name);
+ }
+ TRACE("(%p): hwndOwner = %08x, hDevMode = %08x, hDevNames = %08x\n"
+ "pp. %d-%d, min p %d, max p %d, copies %d, hinst %08x\n"
+ "flags %08lx (%s)\n",
+ 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(PRINTDLGW)) {
+ WARN("structure size failure !!!\n");
+ COMDLG32_SetCommDlgExtendedError(CDERR_STRUCTSIZE);
+ return FALSE;
+ }
+
+ if(lppd->Flags & PD_RETURNDEFAULT) {
+ PRINTER_INFO_2W *pbuf;
+ DRIVER_INFO_3W *dbuf;
+ HANDLE hprn;
+ DWORD needed;
+
+ if(lppd->hDevMode || lppd->hDevNames) {
+ WARN("hDevMode or hDevNames non-zero for PD_RETURNDEFAULT\n");
+ COMDLG32_SetCommDlgExtendedError(PDERR_RETDEFFAILURE);
+ return FALSE;
+ }
+ if(!PRINTDLG_OpenDefaultPrinter(&hprn)) {
+ WARN("Can't find default printer\n");
+ COMDLG32_SetCommDlgExtendedError(PDERR_NODEFAULTPRN);
+ return FALSE;
+ }
+
+ GetPrinterW(hprn, 2, NULL, 0, &needed);
+ pbuf = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*needed);
+ GetPrinterW(hprn, 2, (LPBYTE)pbuf, needed, &needed);
+
+ GetPrinterDriverW(hprn, NULL, 3, NULL, 0, &needed);
+ dbuf = HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*needed);
+ if (!GetPrinterDriverW(hprn, NULL, 3, (LPBYTE)dbuf, needed, &needed)) {
+ ERR("GetPrinterDriverA failed, le %ld, fix your config for printer %s!\n",GetLastError(),debugstr_w(pbuf->pPrinterName));
+ COMDLG32_SetCommDlgExtendedError(PDERR_RETDEFFAILURE);
+ return FALSE;
+ }
+ ClosePrinter(hprn);
+
+ PRINTDLG_CreateDevNamesW(&(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_PTRW *PrintStructures;
+
+ /* load Dialog resources,
+ * depending on Flags indicates Print32 or Print32_setup dialog
+ */
+ hDlgTmpl = PRINTDLG_GetDlgTemplateW(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_PTRW));
+ PrintStructures->dlg.lpPrintDlg = lppd;
+
+ /* and create & process the dialog .
+ * -1 is failure, 0 is broken hwnd, everything else is ok.
+ */
+ bRet = (0<DialogBoxIndirectParamW(hInst, ptr, lppd->hwndOwner,
+ PrintDlgProcW,
+ (LPARAM)PrintStructures));
+
+ if(bRet) {
+ DEVMODEW *lpdm = PrintStructures->lpDevMode, *lpdmReturn;
+ PRINTER_INFO_2W *pi = PrintStructures->lpPrinterInfo;
+ DRIVER_INFO_3W *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 {
+ 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);
+ }
+ }
+ PRINTDLG_CreateDevNamesW(&(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_CreateDCW(lppd);
TRACE("exit! (%d)\n", bRet);
return bRet;
@@ -1735,16 +2818,6 @@
}
-
-/***********************************************************************
- * PrintDlgW (COMDLG32.@)
- */
-BOOL WINAPI PrintDlgW( LPPRINTDLGW printdlg )
-{
- FIXME("A really empty stub\n" );
- return FALSE;
-}
-
/***********************************************************************
*
* PageSetupDlg
@@ -1761,11 +2834,15 @@
typedef struct {
LPPAGESETUPDLGA dlga;
-
PRINTDLGA pdlg;
-} PageSetupData;
+} PageSetupDataA;
-static HGLOBAL PRINTDLG_GetPGSTemplate(PAGESETUPDLGA *lppd)
+typedef struct {
+ LPPAGESETUPDLGW dlga;
+ PRINTDLGW pdlg;
+} PageSetupDataW;
+
+static HGLOBAL PRINTDLG_GetPGSTemplateA(PAGESETUPDLGA *lppd)
{
HGLOBAL hDlgTmpl, hResInfo;
@@ -1782,6 +2859,23 @@
return hDlgTmpl;
}
+static HGLOBAL PRINTDLG_GetPGSTemplateW(PAGESETUPDLGW *lppd)
+{
+ HGLOBAL hDlgTmpl, hResInfo;
+
+ if(lppd->Flags & PSD_ENABLEPAGESETUPTEMPLATEHANDLE) {
+ hDlgTmpl = lppd->hPageSetupTemplate;
+ } else if(lppd->Flags & PSD_ENABLEPAGESETUPTEMPLATE) {
+ hResInfo = FindResourceW(lppd->hInstance,
+ lppd->lpPageSetupTemplateName, RT_DIALOGW);
+ hDlgTmpl = LoadResource(lppd->hInstance, hResInfo);
+ } else {
+ hResInfo = FindResourceW(COMDLG32_hInstance,(LPCWSTR)PAGESETUPDLGORD,RT_DIALOGW);
+ hDlgTmpl = LoadResource(COMDLG32_hInstance,hResInfo);
+ }
+ return hDlgTmpl;
+}
+
static DWORD
_c_10mm2size(PAGESETUPDLGA *dlga,DWORD size) {
if (dlga->Flags & PSD_INTHOUSANDTHSOFINCHES)
@@ -1790,7 +2884,6 @@
* to avoid confusing me
*/
dlga->Flags |= PSD_INHUNDREDTHSOFMILLIMETERS;
- FIXME("returning %ld/100 mm \n",size);
return 10*size;
}
@@ -1809,7 +2902,22 @@
}
static void
-_c_size2str(PageSetupData *pda,DWORD size,LPSTR strout) {
+_c_size2strA(PageSetupDataA *pda,DWORD size,LPSTR strout) {
+ strcpy(strout,"<undef>");
+ if (pda->dlga->Flags & PSD_INHUNDREDTHSOFMILLIMETERS) {
+ sprintf(strout,"%.2fmm",(size*1.0)/100.0);
+ return;
+ }
+ if (pda->dlga->Flags & PSD_INTHOUSANDTHSOFINCHES) {
+ sprintf(strout,"%.2fin",(size*1.0)/1000.0);
+ return;
+ }
+ pda->dlga->Flags |= PSD_INHUNDREDTHSOFMILLIMETERS;
+ sprintf(strout,"%.2fmm",(size*1.0)/100.0);
+ return;
+}
+static void
+_c_size2strW(PageSetupDataW *pda,DWORD size,LPSTR strout) {
strcpy(strout,"<undef>");
if (pda->dlga->Flags & PSD_INHUNDREDTHSOFMILLIMETERS) {
sprintf(strout,"%.2fmm",(size*1.0)/100.0);
@@ -1825,7 +2933,7 @@
}
static DWORD
-_c_str2size(PageSetupData *pda,LPCSTR strin) {
+_c_str2size(PAGESETUPDLGA *dlga,LPCSTR strin) {
float val;
char rest[200];
@@ -1834,7 +2942,7 @@
return 0;
if (!strcmp(rest,"in") || !strcmp(rest,"inch")) {
- if (pda->dlga->Flags & PSD_INTHOUSANDTHSOFINCHES)
+ if (dlga->Flags & PSD_INTHOUSANDTHSOFINCHES)
return 1000*val;
else
return val*25.4*100;
@@ -1843,18 +2951,18 @@
if (!strcmp(rest,"m")) { strcpy(rest,"mm"); val = val*1000.0; }
if (!strcmp(rest,"mm")) {
- if (pda->dlga->Flags & PSD_INHUNDREDTHSOFMILLIMETERS)
+ if (dlga->Flags & PSD_INHUNDREDTHSOFMILLIMETERS)
return 100*val;
else
return 1000.0*val/25.4;
}
if (rest[0]=='\0') {
/* use application supplied default */
- if (pda->dlga->Flags & PSD_INHUNDREDTHSOFMILLIMETERS) {
+ if (dlga->Flags & PSD_INHUNDREDTHSOFMILLIMETERS) {
/* 100*mm */
return 100.0*val;
}
- if (pda->dlga->Flags & PSD_INTHOUSANDTHSOFINCHES) {
+ if (dlga->Flags & PSD_INTHOUSANDTHSOFINCHES) {
/* 1000*inch */
return 1000.0*val;
}
@@ -1869,7 +2977,7 @@
* struct.
*/
static BOOL
-PRINTDLG_PS_UpdateDlgStruct(HWND hDlg, PageSetupData *pda) {
+PRINTDLG_PS_UpdateDlgStructA(HWND hDlg, PageSetupDataA *pda) {
DEVNAMES *dn;
DEVMODEA *dm;
LPSTR devname,portname;
@@ -1880,16 +2988,57 @@
dm = GlobalLock(pda->pdlg.hDevMode);
devname = ((char*)dn)+dn->wDeviceOffset;
portname = ((char*)dn)+dn->wOutputOffset;
- PRINTDLG_SetUpPaperComboBox(hDlg,cmb2,devname,portname,dm);
- PRINTDLG_SetUpPaperComboBox(hDlg,cmb3,devname,portname,dm);
+ PRINTDLG_SetUpPaperComboBoxA(hDlg,cmb2,devname,portname,dm);
+ PRINTDLG_SetUpPaperComboBoxA(hDlg,cmb3,devname,portname,dm);
if (GetDlgItemTextA(hDlg,cmb2,papername,sizeof(papername))>0) {
- PRINTDLG_PaperSize(&(pda->pdlg),papername,&(pda->dlga->ptPaperSize));
+ PRINTDLG_PaperSizeA(&(pda->pdlg),papername,&(pda->dlga->ptPaperSize));
pda->dlga->ptPaperSize.x = _c_10mm2size(pda->dlga,pda->dlga->ptPaperSize.x);
pda->dlga->ptPaperSize.y = _c_10mm2size(pda->dlga,pda->dlga->ptPaperSize.y);
} else
FIXME("could not get dialog text for papersize cmbbox?\n");
-#define GETVAL(id,val) if (GetDlgItemTextA(hDlg,id,buf,sizeof(buf))>0) { val = _c_str2size(pda,buf); } else { FIXME("could not get dlgitemtexta for %x\n",id); }
+#define GETVAL(id,val) if (GetDlgItemTextA(hDlg,id,buf,sizeof(buf))>0) { val = _c_str2size(pda->dlga,buf); } else { FIXME("could not get dlgitemtexta for %x\n",id); }
+ 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;
+ }
+ GlobalUnlock(pda->pdlg.hDevNames);
+ GlobalUnlock(pda->pdlg.hDevMode);
+ return TRUE;
+}
+
+static BOOL
+PRINTDLG_PS_UpdateDlgStructW(HWND hDlg, PageSetupDataW *pda) {
+ DEVNAMES *dn;
+ DEVMODEW *dm;
+ LPWSTR devname,portname;
+ WCHAR papername[64];
+
+ char buf[200];
+
+ 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);
+
+ 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");
+#define GETVAL(id,val) if (GetDlgItemTextA(hDlg,id,buf,sizeof(buf))>0) { val = _c_str2size((LPPAGESETUPDLGA)pda->dlga,buf); } else { FIXME("could not get dlgitemtexta for %x\n",id); }
GETVAL(edt4,pda->dlga->rtMargin.left);
GETVAL(edt5,pda->dlga->rtMargin.top);
GETVAL(edt6,pda->dlga->rtMargin.right);
@@ -1912,7 +3061,7 @@
* This is called after returning from PrintDlg().
*/
static BOOL
-PRINTDLG_PS_ChangePrinter(HWND hDlg, PageSetupData *pda) {
+PRINTDLG_PS_ChangePrinterA(HWND hDlg, PageSetupDataA *pda) {
DEVNAMES *dn;
DEVMODEA *dm;
LPSTR devname,portname;
@@ -1921,20 +3070,37 @@
dm = GlobalLock(pda->pdlg.hDevMode);
devname = ((char*)dn)+dn->wDeviceOffset;
portname = ((char*)dn)+dn->wOutputOffset;
- PRINTDLG_SetUpPaperComboBox(hDlg,cmb2,devname,portname,dm);
- PRINTDLG_SetUpPaperComboBox(hDlg,cmb3,devname,portname,dm);
+ 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_WMCommand(
- HWND hDlg, WPARAM wParam, LPARAM lParam, PageSetupData *pda
+PRINTDLG_PS_ChangePrinterW(HWND hDlg, PageSetupDataW *pda) {
+ DEVNAMES *dn;
+ DEVMODEW *dm;
+ LPWSTR devname,portname;
+
+ 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);
+ GlobalUnlock(pda->pdlg.hDevNames);
+ GlobalUnlock(pda->pdlg.hDevMode);
+ return TRUE;
+}
+
+static BOOL
+PRINTDLG_PS_WMCommandA(
+ HWND hDlg, WPARAM wParam, LPARAM lParam, PageSetupDataA *pda
) {
switch (LOWORD(wParam)) {
case IDOK:
- if (!PRINTDLG_PS_UpdateDlgStruct(hDlg, pda))
+ if (!PRINTDLG_PS_UpdateDlgStructA(hDlg, pda))
return(FALSE);
EndDialog(hDlg, TRUE);
return TRUE ;
@@ -1947,7 +3113,36 @@
pda->pdlg.Flags = 0;
pda->pdlg.hwndOwner = hDlg;
if (PrintDlgA(&(pda->pdlg)))
- PRINTDLG_PS_ChangePrinter(hDlg,pda);
+ PRINTDLG_PS_ChangePrinterA(hDlg,pda);
+ return TRUE;
+ }
+ }
+ FIXME("loword (lparam) %d, wparam 0x%x, lparam %08lx, STUB mostly.\n",
+ LOWORD(lParam),wParam,lParam
+ );
+ return FALSE;
+}
+
+static BOOL
+PRINTDLG_PS_WMCommandW(
+ HWND hDlg, WPARAM wParam, LPARAM lParam, PageSetupDataW *pda
+) {
+ 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);
return TRUE;
}
}
@@ -1961,12 +3156,12 @@
static BOOL WINAPI
PageDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
- PageSetupData *pda;
+ PageSetupDataA *pda;
BOOL res = FALSE;
if (uMsg==WM_INITDIALOG) {
res = TRUE;
- pda = (PageSetupData*)lParam;
+ pda = (PageSetupDataA*)lParam;
SetPropA(hDlg,"__WINE_PAGESETUPDLGDATA",lParam);
if (pda->dlga->Flags & PSD_ENABLEPAGESETUPHOOK) {
res = pda->dlga->lpfnPageSetupHook(hDlg,uMsg,wParam,lParam);
@@ -1998,32 +3193,32 @@
/* We fill them out enabled or not */
if (pda->dlga->Flags & PSD_MARGINS) {
char str[100];
- _c_size2str(pda,pda->dlga->rtMargin.left,str);
+ _c_size2strA(pda,pda->dlga->rtMargin.left,str);
SetDlgItemTextA(hDlg,edt4,str);
- _c_size2str(pda,pda->dlga->rtMargin.top,str);
+ _c_size2strA(pda,pda->dlga->rtMargin.top,str);
SetDlgItemTextA(hDlg,edt5,str);
- _c_size2str(pda,pda->dlga->rtMargin.right,str);
+ _c_size2strA(pda,pda->dlga->rtMargin.right,str);
SetDlgItemTextA(hDlg,edt6,str);
- _c_size2str(pda,pda->dlga->rtMargin.bottom,str);
+ _c_size2strA(pda,pda->dlga->rtMargin.bottom,str);
SetDlgItemTextA(hDlg,edt7,str);
} else {
/* default is 1 inch */
DWORD size = _c_inch2size(pda->dlga,1000);
char str[20];
- _c_size2str(pda,size,str);
+ _c_size2strA(pda,size,str);
SetDlgItemTextA(hDlg,edt4,str);
SetDlgItemTextA(hDlg,edt5,str);
SetDlgItemTextA(hDlg,edt6,str);
SetDlgItemTextA(hDlg,edt7,str);
}
- PRINTDLG_PS_ChangePrinter(hDlg,pda);
+ PRINTDLG_PS_ChangePrinterA(hDlg,pda);
if (pda->dlga->Flags & PSD_DISABLEPAPER) {
EnableWindow(GetDlgItem(hDlg,cmb2),FALSE);
EnableWindow(GetDlgItem(hDlg,cmb3),FALSE);
}
return TRUE;
} else {
- pda = (PageSetupData*)GetPropA(hDlg,"__WINE_PAGESETUPDLGDATA");
+ pda = (PageSetupDataA*)GetPropA(hDlg,"__WINE_PAGESETUPDLGDATA");
if (!pda) {
WARN("__WINE_PAGESETUPDLGDATA prop not set?\n");
return FALSE;
@@ -2035,7 +3230,89 @@
}
switch (uMsg) {
case WM_COMMAND:
- return PRINTDLG_PS_WMCommand(hDlg, wParam, lParam, pda);
+ return PRINTDLG_PS_WMCommandA(hDlg, wParam, lParam, pda);
+ }
+ return FALSE;
+}
+
+static BOOL WINAPI
+PageDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ PageSetupDataW *pda;
+ BOOL res = FALSE;
+
+ if (uMsg==WM_INITDIALOG) {
+ res = TRUE;
+ pda = (PageSetupDataW*)lParam;
+ SetPropA(hDlg,"__WINE_PAGESETUPDLGDATA",lParam);
+ if (pda->dlga->Flags & PSD_ENABLEPAGESETUPHOOK) {
+ res = pda->dlga->lpfnPageSetupHook(hDlg,uMsg,wParam,lParam);
+ if (!res) {
+ FIXME("Setup page hook failed?\n");
+ res = TRUE;
+ }
+ }
+ if (pda->dlga->Flags & PSD_ENABLEPAGEPAINTHOOK) {
+ FIXME("PagePaintHook not yet implemented!\n");
+ }
+ if (pda->dlga->Flags & PSD_DISABLEPRINTER)
+ EnableWindow(GetDlgItem(hDlg, psh3), FALSE);
+ if (pda->dlga->Flags & PSD_DISABLEMARGINS) {
+ EnableWindow(GetDlgItem(hDlg, edt4), FALSE);
+ EnableWindow(GetDlgItem(hDlg, edt5), FALSE);
+ EnableWindow(GetDlgItem(hDlg, edt6), FALSE);
+ EnableWindow(GetDlgItem(hDlg, edt7), FALSE);
+ }
+ /* width larger as height -> landscape */
+ if (pda->dlga->ptPaperSize.x > pda->dlga->ptPaperSize.y)
+ CheckRadioButton(hDlg, rad1, rad2, rad2);
+ else /* this is default if papersize is not set */
+ CheckRadioButton(hDlg, rad1, rad2, rad1);
+ 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];
+ _c_size2strW(pda,pda->dlga->rtMargin.left,str);
+ SetDlgItemTextA(hDlg,edt4,str);
+ _c_size2strW(pda,pda->dlga->rtMargin.top,str);
+ SetDlgItemTextA(hDlg,edt5,str);
+ _c_size2strW(pda,pda->dlga->rtMargin.right,str);
+ SetDlgItemTextA(hDlg,edt6,str);
+ _c_size2strW(pda,pda->dlga->rtMargin.bottom,str);
+ SetDlgItemTextA(hDlg,edt7,str);
+ } else {
+ /* default is 1 inch */
+ DWORD size = _c_inch2size((LPPAGESETUPDLGA)pda->dlga,1000);
+ char str[20];
+ _c_size2strW(pda,size,str);
+ SetDlgItemTextA(hDlg,edt4,str);
+ SetDlgItemTextA(hDlg,edt5,str);
+ SetDlgItemTextA(hDlg,edt6,str);
+ SetDlgItemTextA(hDlg,edt7,str);
+ }
+ PRINTDLG_PS_ChangePrinterW(hDlg,pda);
+ if (pda->dlga->Flags & PSD_DISABLEPAPER) {
+ EnableWindow(GetDlgItem(hDlg,cmb2),FALSE);
+ EnableWindow(GetDlgItem(hDlg,cmb3),FALSE);
+ }
+ return TRUE;
+ } else {
+ pda = (PageSetupDataW*)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_WMCommandW(hDlg, wParam, lParam, pda);
}
return FALSE;
}
@@ -2047,7 +3324,7 @@
HGLOBAL hDlgTmpl;
LPVOID ptr;
BOOL bRet;
- PageSetupData *pda;
+ PageSetupDataA *pda;
PRINTDLGA pdlg;
if(TRACE_ON(commdlg)) {
@@ -2078,12 +3355,12 @@
setupdlg->hDevMode = pdlg.hDevMode;
setupdlg->hDevNames = pdlg.hDevNames;
/* FIXME: Just return "A4" for now. */
- PRINTDLG_PaperSize(&pdlg,"A4",&setupdlg->ptPaperSize);
+ PRINTDLG_PaperSizeA(&pdlg,"A4",&setupdlg->ptPaperSize);
setupdlg->ptPaperSize.x=_c_10mm2size(setupdlg,setupdlg->ptPaperSize.x);
setupdlg->ptPaperSize.y=_c_10mm2size(setupdlg,setupdlg->ptPaperSize.y);
return TRUE;
}
- hDlgTmpl = PRINTDLG_GetPGSTemplate(setupdlg);
+ hDlgTmpl = PRINTDLG_GetPGSTemplateA(setupdlg);
if (!hDlgTmpl) {
COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
return FALSE;
@@ -2110,8 +3387,68 @@
* PageSetupDlgW (COMDLG32.@)
*/
BOOL WINAPI PageSetupDlgW(LPPAGESETUPDLGW setupdlg) {
- FIXME("(%p), stub!\n",setupdlg);
+ HGLOBAL hDlgTmpl;
+ LPVOID ptr;
+ BOOL bRet;
+ PageSetupDataW *pdw;
+ PRINTDLGW pdlg;
+
+ if(TRACE_ON(commdlg)) {
+ char flagstr[1000] = "";
+ struct pd_flags *pflag = psd_flags;
+ for( ; pflag->name; pflag++) {
+ if(setupdlg->Flags & pflag->flag) {
+ strcat(flagstr, pflag->name);
+ strcat(flagstr, "|");
+ }
+ }
+ TRACE("(%p): hwndOwner = %08x, hDevMode = %08x, hDevNames = %08x\n"
+ "hinst %08x, flags %08lx (%s)\n",
+ setupdlg, setupdlg->hwndOwner, setupdlg->hDevMode,
+ setupdlg->hDevNames,
+ setupdlg->hInstance, setupdlg->Flags, flagstr);
+ }
+
+ /* First get default printer data, we need it right after that. */
+ memset(&pdlg,0,sizeof(pdlg));
+ pdlg.lStructSize = sizeof(pdlg);
+ pdlg.Flags = PD_RETURNDEFAULT;
+ bRet = PrintDlgW(&pdlg);
+ if (!bRet) return FALSE;
+
+ /* short cut exit, just return default values */
+ if (setupdlg->Flags & PSD_RETURNDEFAULT) {
+ const WCHAR a4[] = {'A','4',0};
+ 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);
+ return FALSE;
+ }
+ 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;
}
/**********************************************************************
@@ -2159,7 +3496,7 @@
/* We need to map those for the 32bit window procedure, compare
* with 32Ato16 mapper in winproc.c
*/
- return PRINTDLG_WMCommand(
+ return PRINTDLG_WMCommandA(
hDlg,
MAKEWPARAM(wParam,HIWORD(lParam)),
LOWORD(lParam),