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

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

Remember last selected printer during session (closes #96)

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