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

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

Odd/Even? printing for 'As Image' printing, pdf plugin: fix document title

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