source: trunk/Lucide/SOURCE/gui/printDlg.cpp @ 130

Last change on this file since 130 was 123, checked in by Eugene Romanenko, 15 years ago

allow printing in descending order (closes #88), small interface fixes (closes #89)

File size: 22.9 KB
Line 
1/* ***** BEGIN LICENSE BLOCK *****
2 * Version: CDDL 1.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the COMMON DEVELOPMENT AND
5 * DISTRIBUTION LICENSE (CDDL) Version 1.0 (the "License"); you may not use
6 * this file except in compliance with the License. You may obtain a copy of
7 * the License at http://www.sun.com/cddl/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Initial Developer of the Original Code is
15 * Eugene Romanenko, netlabs.org.
16 * Portions created by the Initial Developer are Copyright (C) 2006
17 * the Initial Developer. All Rights Reserved.
18 *
19 * Contributor(s):
20 *
21 * Alternatively, the contents of this file may be used under the terms of
22 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
23 * in which case the provisions of the LGPL are applicable instead of those
24 * above. If you wish to allow use of your version of this file only under the
25 * terms of the LGPL, and not to allow others to use your version of this file
26 * under the terms of the CDDL, indicate your decision by deleting the
27 * provisions above and replace them with the notice and other provisions
28 * required by the LGPL. If you do not delete the provisions above, a recipient
29 * may use your version of this file under the terms of any one of the CDDL
30 * or the LGPL.
31 *
32 * ***** END LICENSE BLOCK ***** */
33
34
35#define INCL_WIN
36#define INCL_DEV
37#define INCL_ERRORS
38#define INCL_SPL
39#define INCL_SPLDOSPRINT
40#include <os2.h>
41
42#include <ludoc.xh>
43
44#include "globals.h"
45#include "printDlg.h"
46#include "Lucide_res.h"
47#include "luutils.h"
48#include "messages.h"
49
50
51PrintDlg::PrintDlg( HWND hWndFrame, LuDocument *_doc, long _currentpage )
52{
53    hFrame      = hWndFrame;
54    doc         = _doc;
55    scalable    = _doc->isScalable( ev );
56    fixed       = _doc->isFixedImage( ev );
57    currentpage = _currentpage;
58    pcurForm    = new HCINFO;
59    memset( pcurForm, 0, sizeof( HCINFO ) );
60    psetup      = new PrintSetup;
61    memset( psetup, 0, sizeof( PrintSetup ) );
62}
63
64PrintDlg::~PrintDlg()
65{
66    delete pcurForm;
67    delete psetup;
68}
69
70ULONG PrintDlg::showDialog()
71{
72    return WinDlgBox( HWND_DESKTOP, hFrame, printDlgProc,
73                      NULLHANDLE, IDD_PRINT, this );
74}
75
76void PrintDlg::getPrintSetup( PrintSetup *p ) {
77    memcpy( p, psetup, sizeof( PrintSetup ) );
78}
79
80void PrintDlg::setCurrentQInfo( HWND hwnd, PPRQINFO3 q )
81{
82    memcpy( &(psetup->QueueInfo), q, sizeof( PRQINFO3 ) );
83    WinSetDlgItemText( hwnd, IDC_PNAME, psetup->QueueInfo.pszComment );
84    WinSetDlgItemText( hwnd, IDC_PDESCRIPTION, psetup->QueueInfo.pszDriverName );
85    WinEnableControl( hwnd, IDC_JOBPROPERTIES, TRUE );
86    WinEnableControl( hwnd, DID_OK, TRUE );
87
88    // Set the print type
89    if ( doc->isPostScriptExportable( ev ) && isPostscriptDevice() ) {
90        WinEnableControl( hwnd, IDC_TYPE_POSTSCRIPT, TRUE );
91        WinCheckButton( hwnd, IDC_TYPE_POSTSCRIPT, TRUE );
92    }
93    else {
94        WinEnableControl( hwnd, IDC_TYPE_POSTSCRIPT, FALSE );
95        WinCheckButton( hwnd, IDC_TYPE_ASIMAGE, TRUE );
96    }
97
98    WinSendMsg( hwnd, WM_CONTROL,
99                MPFROM2SHORT( IDC_TYPE_POSTSCRIPT, BN_CLICKED ),
100                MPFROMHWND( WinWindowFromID( hwnd, IDC_TYPE_POSTSCRIPT ) ) );
101
102    WinCheckButton( hwnd, isPortraitOrientation() ? IDC_PORTRAIT : IDC_LANDSCAPE, TRUE );
103
104    applyForm( hwnd );
105}
106
107void PrintDlg::enumQueues( HWND hwnd )
108{
109    HWND list = WinWindowFromID( hwnd, IDC_PNAME );
110    ULONG cReturned = 0, cTotal = 0, cbNeeded = 0;
111    SPLERR se = SplEnumQueue( NULL, 3, NULL, 0L, &cReturned,
112                              &cTotal, &cbNeeded, NULL );
113    if ( cTotal == 0L ) {
114        // TODO: 'no printers installed' message  (?)
115    }
116
117    pQueueInfo = (PPRQINFO3)malloc( cbNeeded );
118
119    se = SplEnumQueue( NULL, 3, pQueueInfo, cbNeeded, &cReturned,
120                       &cTotal, &cbNeeded, NULL );
121    if ( se != NO_ERROR ) {
122        // TODO: error message
123        free( pQueueInfo );
124        pQueueInfo = NULL;
125        return;
126    }
127
128    USHORT sEntry;
129    for ( ULONG i = 0; i < cReturned; i++ )
130    {
131        sEntry = (SHORT)WinSendMsg( list, LM_INSERTITEM, MPFROMSHORT(LIT_END),
132                                    MPFROMP( pQueueInfo[i].pszComment ) );
133        WinSendMsg( list, LM_SETITEMHANDLE,
134                    MPFROMSHORT(sEntry), MPFROMP( &(pQueueInfo[i]) ) );
135
136        if ( pQueueInfo[i].fsType & PRQ3_TYPE_APPDEFAULT ) {
137            setCurrentQInfo( hwnd, &( pQueueInfo[i] ) );
138        }
139    }
140}
141
142
143void PrintDlg::showJobProperties( HWND hwnd )
144{
145    if ( psetup->QueueInfo.pszName[0] == 0 ) {
146        return;
147    }
148
149    char achDriverName[ DRIVERNAME_LENGTH ];
150    char achDeviceName[ DEVICENAME_LENGTH ];
151
152    // The pszDriverName is of the form DRIVER.DEVICE (e.g.,
153    // LASERJET.HP LaserJet IID) so we need to separate it at the dot
154    int i = strcspn( psetup->QueueInfo.pszDriverName, "." );
155    if ( i > 0 ) {
156        strncpy( achDriverName, psetup->QueueInfo.pszDriverName, i );
157        achDriverName[ i ] = '\0';
158        strcpy( achDeviceName, &( psetup->QueueInfo.pszDriverName[ i + 1 ] ) );
159    }
160    else {
161        strcpy( achDriverName, psetup->QueueInfo.pszDriverName );
162        *achDeviceName = '\0';
163    }
164
165    // There may be more than one printer assigned to this print queue
166    // We will use the first in the comma separated list.  We would
167    // need an expanded dialog for the user to be more specific.
168    char *pszTemp = strchr( psetup->QueueInfo.pszPrinters, ',' );
169    if ( pszTemp != NULL ) {
170        // Strip off comma and trailing printer names
171        *pszTemp = '\0';
172    }
173
174    // Post the job properties dialog for the printer to allow the
175    // user to modify the options
176    DevPostDeviceModes( hab, psetup->QueueInfo.pDriverData, achDriverName,
177                        achDeviceName, psetup->QueueInfo.pszPrinters, DPDM_POSTJOBPROP );
178
179    WinCheckButton( hwnd, isPortraitOrientation() ? IDC_PORTRAIT : IDC_LANDSCAPE, TRUE );
180    applyForm( hwnd );
181}
182
183HDC PrintDlg::getInfoDC()
184{
185    char *achDriverName = new char[ DRIVERNAME_LENGTH ];
186    // build a devopenstruct for the call to DevOpenDC
187    DEVOPENSTRUC *dos   = new DEVOPENSTRUC;
188    memset( dos, 0, sizeof( DEVOPENSTRUC ) );
189    dos->pszLogAddress = psetup->QueueInfo.pszName;              // 1
190    strcpy( achDriverName, psetup->QueueInfo.pszDriverName );
191    achDriverName[ strcspn( achDriverName, "." ) ] = '\0';
192    dos->pszDriverName = achDriverName;                          // 2
193    dos->pdriv = psetup->QueueInfo.pDriverData;                  // 3
194
195    HDC hdcPrinterInfo = DevOpenDC( hab, OD_INFO, "*", 3L, (PDEVOPENDATA)dos, NULLHANDLE );
196
197    delete achDriverName;
198    delete dos;
199
200    return hdcPrinterInfo;
201}
202
203bool PrintDlg::isPostscriptDevice()
204{
205    long lTech = 0;
206    HDC hdcPrinterInfo = getInfoDC();
207    if ( hdcPrinterInfo != DEV_ERROR ) {
208        DevQueryCaps( hdcPrinterInfo, CAPS_TECHNOLOGY, sizeof(long), &lTech );
209        DevCloseDC( hdcPrinterInfo );
210    }
211    return ( lTech == CAPS_TECH_POSTSCRIPT );
212}
213
214// **************************************************
215// OpenWatcom headers doesn't have these declarations
216// **************************************************
217#ifndef DJP_SJ_ORIENTATION
218typedef struct _djpItem
219{
220    ULONG       cb;
221    ULONG       ulProperty;
222    LONG        lType;
223    ULONG       ulNumReturned;
224    ULONG       ulValue;
225} DJP_ITEM, *PDJP_ITEM;
226
227#define DJP_ALL                 1L
228#define DJP_CURRENT             2L
229#define DJP_NONE                0L
230#define DJP_SJ_ORIENTATION      1L
231
232#define DJP_ORI_PORTRAIT        1L
233#define DJP_ORI_LANDSCAPE       2L
234#define DJP_ORI_REV_PORTRAIT    3L
235#define DJP_ORI_REV_LANDSCAPE   4L
236#endif
237// **************************************************
238
239bool PrintDlg::isPortraitOrientation()
240{
241    bool rVal = true;
242
243    HDC hdcPrinterInfo = getInfoDC();
244    if ( hdcPrinterInfo != DEV_ERROR )
245    {
246        DJP_ITEM djp[ 2 ] = { { 0 } };
247
248        // Get Orientation from Job Properties
249        djp[0].cb = sizeof( DJP_ITEM );
250        djp[0].ulProperty = DJP_SJ_ORIENTATION;
251        djp[0].lType = DJP_CURRENT;
252        djp[0].ulNumReturned = 1;
253        djp[0].ulValue = 1;
254
255        djp[1].cb = sizeof( DJP_ITEM );
256        djp[1].ulProperty = 0;
257        djp[1].lType = DJP_NONE;
258        djp[1].ulNumReturned = 1;
259        djp[1].ulValue = 0;
260
261        LONG outSz = psetup->QueueInfo.pDriverData->cb;
262        LONG rc = DevEscape( hdcPrinterInfo, DEVESC_QUERYJOBPROPERTIES,
263                             sizeof( DJP_ITEM ) * 2, (PCHAR)djp,
264                             &outSz, (PCHAR)psetup->QueueInfo.pDriverData );
265
266        if ( ( rc == DEV_OK ) || ( rc == DEV_WARNING ) )
267        {
268            if ( ( djp[0].lType != DJP_NONE ) &&
269                 ( djp[0].ulProperty == DJP_SJ_ORIENTATION ) &&
270                 ( djp[0].lType > 0 ) )
271            {
272                if ( ( djp[0].ulValue == DJP_ORI_LANDSCAPE ) ||
273                     ( djp[0].ulValue == DJP_ORI_REV_LANDSCAPE ) ) {
274                    rVal = false;
275                }
276            }
277        }
278
279        DevCloseDC( hdcPrinterInfo );
280    }
281
282    return rVal;
283}
284
285
286void PrintDlg::setPortraitOrientation( bool portrait, HWND hwnd )
287{
288    HDC hdcPrinterInfo = getInfoDC();
289    if ( hdcPrinterInfo != DEV_ERROR )
290    {
291        DJP_ITEM djp[ 2 ] = { { 0 } };
292
293        // Set Orientation
294        djp[0].cb = sizeof( DJP_ITEM );
295        djp[0].ulProperty = DJP_SJ_ORIENTATION;
296        djp[0].lType = DJP_CURRENT;
297        djp[0].ulNumReturned = 1;
298        djp[0].ulValue = portrait ? DJP_ORI_PORTRAIT : DJP_ORI_LANDSCAPE;
299
300        djp[1].cb = sizeof( DJP_ITEM );
301        djp[1].ulProperty = 0;
302        djp[1].lType = DJP_NONE;
303        djp[1].ulNumReturned = 1;
304        djp[1].ulValue = 0;
305
306        LONG outSz = psetup->QueueInfo.pDriverData->cb;
307        DevEscape( hdcPrinterInfo, DEVESC_SETJOBPROPERTIES,
308                   sizeof( DJP_ITEM ) * 2, (PCHAR)djp,
309                   &outSz, (PCHAR)psetup->QueueInfo.pDriverData );
310
311        DevCloseDC( hdcPrinterInfo );
312
313        applyForm( hwnd );
314    }
315}
316
317
318bool PrintDlg::queryCurrentForm()
319{
320    HDC hdcPrinterInfo = getInfoDC();
321    if ( hdcPrinterInfo == DEV_ERROR ) {
322        return false;
323    }
324
325    LONG lForms = DevQueryHardcopyCaps( hdcPrinterInfo, 0, 0, NULL );
326    if ( lForms == DQHC_ERROR ) {
327        DevCloseDC( hdcPrinterInfo );
328        return false;
329    }
330
331    HCINFO *forms = new HCINFO[ lForms ];
332    memset( forms, 0, sizeof( HCINFO ) * lForms );
333    lForms = DevQueryHardcopyCaps( hdcPrinterInfo, 0, lForms, forms );
334    if ( lForms == DQHC_ERROR ) {
335        delete forms;
336        DevCloseDC( hdcPrinterInfo );
337        return false;
338    }
339
340    for ( LONG i = 0; i < lForms; i++ ) {
341        if ( forms[i].flAttributes & HCAPS_CURRENT ) {
342            memcpy( pcurForm, &( forms[i] ), sizeof( HCINFO ) );
343            break;
344        }
345    }
346
347    delete forms;
348    DevCloseDC( hdcPrinterInfo );
349    return true;
350}
351
352void PrintDlg::applyForm( HWND hwnd )
353{
354    if ( queryCurrentForm() )
355    {
356        WinSetDlgItemText( hwnd, IDC_SELECTED_FORM, pcurForm->szFormname );
357
358        long margin_top_min    = pcurForm->cy - pcurForm->yTopClip;
359        long margin_left_min   = pcurForm->xLeftClip;
360        long margin_bottom_min = pcurForm->yBottomClip;
361        long margin_right_min  = pcurForm->cx - pcurForm->xRightClip;
362
363        long margin_top_max    = pcurForm->cy - margin_bottom_min;
364        long margin_left_max   = pcurForm->cx - margin_right_min;
365        long margin_bottom_max = pcurForm->cy - margin_top_min;
366        long margin_right_max  = pcurForm->cx - margin_left_min;
367
368        WinSendDlgItemMsg( hwnd, IDC_MTOP, SPBM_SETLIMITS,
369                           MPFROMLONG( margin_top_max ), MPFROMLONG( margin_top_min ) );
370        WinSendDlgItemMsg( hwnd, IDC_MTOP, SPBM_SETCURRENTVALUE,
371                           MPFROMLONG( margin_top_min ), MPVOID );
372        WinSendDlgItemMsg( hwnd, IDC_MLEFT, SPBM_SETLIMITS,
373                           MPFROMLONG( margin_left_max ), MPFROMLONG( margin_left_min ) );
374        WinSendDlgItemMsg( hwnd, IDC_MLEFT, SPBM_SETCURRENTVALUE,
375                           MPFROMLONG( margin_left_min ), MPVOID );
376        WinSendDlgItemMsg( hwnd, IDC_MBOTTOM, SPBM_SETLIMITS,
377                           MPFROMLONG( margin_bottom_max ), MPFROMLONG( margin_bottom_min ) );
378        WinSendDlgItemMsg( hwnd, IDC_MBOTTOM, SPBM_SETCURRENTVALUE,
379                           MPFROMLONG( margin_bottom_min ), MPVOID );
380        WinSendDlgItemMsg( hwnd, IDC_MRIGHT, SPBM_SETLIMITS,
381                           MPFROMLONG( margin_right_max ), MPFROMLONG( margin_right_min ) );
382        WinSendDlgItemMsg( hwnd, IDC_MRIGHT, SPBM_SETCURRENTVALUE,
383                           MPFROMLONG( margin_right_min ), MPVOID );
384
385        //somPrintf( "cx %d, cy %d, xLeftClip %d, yBottomClip %d, xRightClip %d, yTopClip %d\n",
386        //           pcurForm->cx, pcurForm->cy, pcurForm->xLeftClip, pcurForm->yBottomClip,
387        //           pcurForm->xRightClip, pcurForm->yTopClip );
388
389    }
390    else {
391        WinSetDlgItemText( hwnd, IDC_SELECTED_FORM, "" );
392    }
393}
394
395
396// do not allow round-trip on spins
397static MRESULT EXPENTRY spinProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
398{
399    PFNWP oldSpinProc = (PFNWP)WinQueryWindowULong( hwnd, QWL_USER );
400
401    if ( msg == SPBM_SPINDOWN )
402    {
403        LONG upLimit = 0, lowLimit = 0, curVal = 0;
404        WinSendMsg( hwnd, SPBM_QUERYLIMITS, MPFROMP( &upLimit ), MPFROMP( &lowLimit ) );
405        WinSendMsg( hwnd, SPBM_QUERYVALUE, MPFROMP( &curVal ), MPFROM2SHORT( 0, SPBQ_DONOTUPDATE ) );
406        if ( curVal <= lowLimit ) {
407            return (MRESULT)TRUE;
408        }
409    }
410    else if ( msg == SPBM_SPINUP )
411    {
412        LONG upLimit = 0, lowLimit = 0, curVal = 0;
413        WinSendMsg( hwnd, SPBM_QUERYLIMITS, MPFROMP( &upLimit ), MPFROMP( &lowLimit ) );
414        WinSendMsg( hwnd, SPBM_QUERYVALUE, MPFROMP( &curVal ), MPFROM2SHORT( 0, SPBQ_DONOTUPDATE ) );
415        if ( curVal >= upLimit ) {
416            return (MRESULT)TRUE;
417        }
418    }
419
420    return oldSpinProc( hwnd, msg, mp1, mp2 );
421}
422
423MRESULT EXPENTRY PrintDlg::printDlgProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
424{
425    // This is a static method, so we don't know which instantiation we're
426    // dealing with. But we can get a pseudo-this from the parameter to
427    // WM_INITDLG, which we therafter store with the window and retrieve
428    // as follows:
429    PrintDlg *_this = (PrintDlg *)WinQueryWindowULong( hwnd, QWL_USER );
430
431    switch (msg)
432    {
433
434        // Dialog has just been created
435        case WM_INITDLG:
436        {
437            // Save the mp2 into our user data so that subsequent calls have
438            // access to the parent C++ object
439            WinSetWindowULong( hwnd, QWL_USER, (ULONG)mp2 );
440            _this = (PrintDlg *)mp2;
441            localizeDialog( hwnd );
442            centerWindow( _this->hFrame, hwnd );
443
444            // Print range
445            WinCheckButton( hwnd, IDC_RANGEALL, TRUE );
446
447            // Set the print range spins
448            long pages = _this->doc->getPageCount( ev );
449            WinSendDlgItemMsg( hwnd, IDC_PGFROM, SPBM_SETLIMITS,
450                               MPFROMLONG( pages ), MPFROMLONG( 1 ) );
451            WinSendDlgItemMsg( hwnd, IDC_PGFROM, SPBM_SETCURRENTVALUE,
452                               MPFROMLONG( 1 ), MPVOID );
453            WinSendDlgItemMsg( hwnd, IDC_PGTO, SPBM_SETLIMITS,
454                               MPFROMLONG( pages ), MPFROMLONG( 1 ) );
455            WinSendDlgItemMsg( hwnd, IDC_PGTO, SPBM_SETCURRENTVALUE,
456                               MPFROMLONG( pages ), MPVOID );
457
458            // Number of copies
459            WinSendDlgItemMsg( hwnd, IDC_COPIES, SPBM_SETLIMITS,
460                               MPFROMLONG( 999 ), MPFROMLONG( 1 ) );
461            WinSendDlgItemMsg( hwnd, IDC_COPIES, SPBM_SETCURRENTVALUE,
462                               MPFROMLONG( 1 ), MPVOID );
463
464            // Enum printer queues
465            _this->enumQueues( hwnd );
466
467            HWND spin = WinWindowFromID( hwnd, IDC_MLEFT );
468            PFNWP proc = WinSubclassWindow( spin, spinProc );
469            WinSetWindowULong( spin, QWL_USER, (ULONG)proc );
470            spin = WinWindowFromID( hwnd, IDC_MRIGHT );
471            proc = WinSubclassWindow( spin, spinProc );
472            WinSetWindowULong( spin, QWL_USER, (ULONG)proc );
473            spin = WinWindowFromID( hwnd, IDC_MTOP );
474            proc = WinSubclassWindow( spin, spinProc );
475            WinSetWindowULong( spin, QWL_USER, (ULONG)proc );
476            spin = WinWindowFromID( hwnd, IDC_MBOTTOM );
477            proc = WinSubclassWindow( spin, spinProc );
478            WinSetWindowULong( spin, QWL_USER, (ULONG)proc );
479
480            return (MRESULT)FALSE;
481        }
482
483        case WM_CONTROL:
484        {
485            switch ( SHORT1FROMMP(mp1) )
486            {
487                case IDC_PNAME:
488                {
489                    if ( SHORT2FROMMP(mp1) == CBN_LBSELECT )
490                    {
491                        SHORT rc = (SHORT)WinSendDlgItemMsg( hwnd, IDC_PNAME, LM_QUERYSELECTION,
492                                                             MPFROMSHORT( LIT_CURSOR ), MPVOID );
493                        if ( rc != LIT_NONE ) {
494                            MRESULT r = WinSendDlgItemMsg( hwnd, IDC_PNAME, LM_QUERYITEMHANDLE,
495                                                           MPFROMSHORT( rc ), MPVOID );
496                            _this->setCurrentQInfo( hwnd, (PPRQINFO3)r );
497                        }
498                    }
499                }
500                break;
501
502                case IDC_RANGEALL:
503                case IDC_RANGECURRENT:
504                case IDC_RANGEPAGES:
505                {
506                    BOOL en = WinQueryButtonCheckstate( hwnd, IDC_RANGEPAGES );
507                    WinEnableControl( hwnd, IDC_LABELFROM, en );
508                    WinEnableControl( hwnd, IDC_PGFROM, en );
509                    WinEnableControl( hwnd, IDC_LABELTO, en );
510                    WinEnableControl( hwnd, IDC_PGTO, en );
511                }
512                break;
513
514                case IDC_TYPE_POSTSCRIPT:
515                case IDC_TYPE_ASIMAGE:
516                {
517                    BOOL asimg = WinQueryButtonCheckstate( hwnd, IDC_TYPE_ASIMAGE );
518                    WinEnableControl( hwnd, IDC_HIGHER_IMAGE_QUALITY,
519                                      asimg && _this->scalable && !_this->fixed );
520                }
521                break;
522
523                case IDC_PORTRAIT:
524                case IDC_LANDSCAPE:
525                {
526                    bool portrait = WinQueryButtonCheckstate( hwnd, IDC_PORTRAIT );
527                    _this->setPortraitOrientation( portrait, hwnd );
528                }
529                break;
530
531            }
532        }
533        break;
534
535        case WM_COMMAND:
536            switch (SHORT1FROMMP(mp1))
537            {
538                case IDC_JOBPROPERTIES:
539                    _this->showJobProperties( hwnd );
540                    return (MRESULT)FALSE;
541
542                case DID_OK:
543                    {
544                        long ml = 0, mr = 0, mt = 0, mb = 0;
545                        WinSendDlgItemMsg( hwnd, IDC_MLEFT, SPBM_QUERYVALUE, MPFROMP( &ml ), MPFROM2SHORT( 0, SPBQ_UPDATEIFVALID ) );
546                        WinSendDlgItemMsg( hwnd, IDC_MRIGHT, SPBM_QUERYVALUE, MPFROMP( &mr ), MPFROM2SHORT( 0, SPBQ_UPDATEIFVALID ) );
547                        WinSendDlgItemMsg( hwnd, IDC_MTOP, SPBM_QUERYVALUE, MPFROMP( &mt ), MPFROM2SHORT( 0, SPBQ_UPDATEIFVALID ) );
548                        WinSendDlgItemMsg( hwnd, IDC_MBOTTOM, SPBM_QUERYVALUE, MPFROMP( &mb ), MPFROM2SHORT( 0, SPBQ_UPDATEIFVALID ) );
549
550                        if ( ( _this->pcurForm->cx < ( ml + mr ) ) ||
551                             ( _this->pcurForm->cy < ( mt + mb ) ) )
552                        {
553                            char *wrongmargins = newstrdupL( PD_WRONG_MARGINS );
554                            WinMessageBox( HWND_DESKTOP, _this->hFrame, wrongmargins, NULL,
555                                           1, MB_OK | MB_ERROR | MB_MOVEABLE );
556                            delete wrongmargins;
557                            return (MRESULT)FALSE;  // Return, don't leave dialog
558                        }
559
560                        _this->psetup->margin_left   = ml;
561                        _this->psetup->margin_right  = mr;
562                        _this->psetup->margin_top    = mt;
563                        _this->psetup->margin_bottom = mb;
564
565                        LONG cp = 0;
566                        WinSendDlgItemMsg( hwnd, IDC_COPIES, SPBM_QUERYVALUE, MPFROMP( &cp ), MPFROM2SHORT( 0, SPBQ_UPDATEIFVALID ) );
567                        _this->psetup->copies = cp;
568
569                        _this->psetup->range = RangeAll;
570                        _this->psetup->pgfrom = 1;
571                        _this->psetup->pgto = _this->doc->getPageCount( ev );
572
573                        if ( WinQueryButtonCheckstate( hwnd, IDC_RANGECURRENT ) ) {
574                            _this->psetup->range = RangeCurrent;
575                            _this->psetup->pgfrom = _this->currentpage;
576                            _this->psetup->pgto = _this->currentpage;
577                        }
578
579                        if ( WinQueryButtonCheckstate( hwnd, IDC_RANGEPAGES ) )
580                        {
581                            _this->psetup->range = RangePages;
582                            LONG tmpVal = 0;
583                            BOOL rc = (BOOL)WinSendDlgItemMsg( hwnd, IDC_PGFROM, SPBM_QUERYVALUE, MPFROMP( &tmpVal ), MPFROM2SHORT( 0, SPBQ_UPDATEIFVALID ) );
584                            if ( rc && ( tmpVal > 0 ) ) {
585                                _this->psetup->pgfrom = tmpVal;
586                            }
587                            rc = (BOOL)WinSendDlgItemMsg( hwnd, IDC_PGTO, SPBM_QUERYVALUE, MPFROMP( &tmpVal ), MPFROM2SHORT( 0, SPBQ_UPDATEIFVALID ) );
588                            if ( rc && ( tmpVal > 0 ) ) {
589                                _this->psetup->pgto = tmpVal;
590                            }
591                        }
592
593                        _this->psetup->ptype = TypePostScript;
594                        if ( WinQueryButtonCheckstate( hwnd, IDC_TYPE_ASIMAGE ) ) {
595                            _this->psetup->ptype = TypeAsImage;
596                        }
597                        _this->psetup->higherQuality = WinQueryButtonCheckstate( hwnd, IDC_HIGHER_IMAGE_QUALITY );
598
599                        WinDismissDlg( hwnd, DID_OK );
600                    }
601                    return (MRESULT)FALSE;
602
603                case DID_CANCEL:
604                    WinDismissDlg( hwnd, DID_CANCEL );
605                    return (MRESULT)FALSE;
606            };
607            return (MRESULT)FALSE;
608    }
609    return WinDefDlgProc( hwnd, msg, mp1, mp2 );
610}
611
612
Note: See TracBrowser for help on using the repository browser.