Sync to Wine-0_9_16:
[reactos.git] / reactos / dll / win32 / comdlg32 / printdlg.c
index 2af10ee..4fb0bdb 100644 (file)
@@ -18,7 +18,7 @@
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 #include <ctype.h>
 #include <stdlib.h>
@@ -325,8 +325,9 @@ static BOOL PRINTDLG_UpdatePrintDlgA(HWND hDlg,
            lppd->Flags &= ~PD_PAGENUMS;
 
        if (IsDlgButtonChecked(hDlg, chx1) == BST_CHECKED) {/* Print to file */
+           static char file[] = "FILE:";
            lppd->Flags |= PD_PRINTTOFILE;
-           pi->pPortName = "FILE:";
+           pi->pPortName = file;
        }
 
        if (IsDlgButtonChecked(hDlg, chx2) == BST_CHECKED) { /* Collate */
@@ -2480,18 +2481,29 @@ PRINTDLG_PS_UpdateDlgStructA(HWND hDlg, PageSetupDataA *pda) {
     
     dn = GlobalLock(pda->pdlg.hDevNames);
     dm = GlobalLock(pda->pdlg.hDevMode);
+
+    /* Save paper orientation into device context */
     if(pda->curdlg.ptPaperSize.x > pda->curdlg.ptPaperSize.y)
-       dm->u.s.dmOrientation = DMORIENT_LANDSCAPE;
+        dm->u.s.dmOrientation = DMORIENT_LANDSCAPE;
     else
-       dm->u.s.dmOrientation = DMORIENT_PORTRAIT;
-    
+        dm->u.s.dmOrientation = DMORIENT_PORTRAIT;
+
+    /* Save paper size into the device context */
     paperword = SendDlgItemMessageA(hDlg,cmb2,CB_GETITEMDATA,
-       SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0), 0);
+        SendDlgItemMessageA(hDlg, cmb2, CB_GETCURSEL, 0, 0), 0);
     if (paperword != CB_ERR)
-       dm->u.s.dmPaperSize = paperword;
+        dm->u.s.dmPaperSize = paperword;
     else
-       FIXME("could not get dialog text for papersize cmbbox?\n");
-    
+        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->u.s.dmDefaultSource = paperword;
+    else
+        FIXME("could not get dialog text for papersize cmbbox?\n");
+
     GlobalUnlock(pda->pdlg.hDevNames);
     GlobalUnlock(pda->pdlg.hDevMode);
 
@@ -2510,7 +2522,10 @@ PRINTDLG_PS_UpdateDlgStructW(HWND hDlg, PageSetupDataW *pda) {
     dm = GlobalLock(pda->pdlg.hDevMode);
     devname    = ((WCHAR*)dn)+dn->wDeviceOffset;
     portname   = ((WCHAR*)dn)+dn->wOutputOffset;
+
+    /* Save paper size into device context */
     PRINTDLG_SetUpPaperComboBoxW(hDlg,cmb2,devname,portname,dm);
+    /* Save paper source into device context */
     PRINTDLG_SetUpPaperComboBoxW(hDlg,cmb3,devname,portname,dm);
 
     if (GetDlgItemTextW(hDlg,cmb2,papername,sizeof(papername))>0) {
@@ -3345,20 +3360,26 @@ BOOL WINAPI PageSetupDlgA(LPPAGESETUPDLGA setupdlg) {
             return FALSE;
         }
 
-    /* First get default printer data, we need it right after that. */
+    /* Initialize default printer struct. If no printer device info is specified
+       retrieve the default printer data. */
     memset(&pdlg,0,sizeof(pdlg));
     pdlg.lStructSize   = sizeof(pdlg);
-    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;
+    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;
+        }
     }
-   
+
     /* short cut exit, just return default values */
     if (setupdlg->Flags & PSD_RETURNDEFAULT) {
        DEVMODEA *dm;
@@ -3427,12 +3448,25 @@ BOOL WINAPI PageSetupDlgW(LPPAGESETUPDLGW setupdlg) {
              setupdlg->hInstance, setupdlg->Flags, flagstr);
     }
 
-    /* First get default printer data, we need it right after that. */
+    /* Initialize default printer struct. If no printer device info is specified
+       retrieve the default printer data. */
     memset(&pdlg,0,sizeof(pdlg));
     pdlg.lStructSize   = sizeof(pdlg);
-    pdlg.Flags         = PD_RETURNDEFAULT;
-    bRet = PrintDlgW(&pdlg);
-    if (!bRet) return FALSE;
+    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;
+        }
+    }
 
     /* short cut exit, just return default values */
     if (setupdlg->Flags & PSD_RETURNDEFAULT) {