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

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

intermediate commit, incomplete printing procedures

File size: 11.4 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 "printDlg.h"
45#include "Lucide_res.h"
46#include "luutils.h"
47
48
49PrintDlg::PrintDlg( HWND hWndFrame, LuDocument *_doc, long _currentpage )
50{
51    hFrame      = hWndFrame;
52    doc         = _doc;
53    currentpage = _currentpage;
54    psetup      = new PrintSetup;
55    memset( psetup, 0, sizeof( PrintSetup ) );
56}
57
58PrintDlg::~PrintDlg()
59{
60    delete psetup;
61}
62
63ULONG PrintDlg::showDialog()
64{
65    return WinDlgBox( HWND_DESKTOP, hFrame, printDlgProc,
66                      NULLHANDLE, IDD_PRINT, this );
67}
68
69void PrintDlg::getPrintSetup( PrintSetup *p ) {
70    memcpy( p, psetup, sizeof( PrintSetup ) );
71}
72
73void PrintDlg::setCurrentQInfo( HWND hwnd, PPRQINFO3 q )
74{
75    memcpy( &(psetup->QueueInfo), q, sizeof( PRQINFO3 ) );
76    WinSetDlgItemText( hwnd, IDC_PNAME, psetup->QueueInfo.pszComment );
77    WinSetDlgItemText( hwnd, IDC_PDESCRIPTION, psetup->QueueInfo.pszDriverName );
78    WinEnableControl( hwnd, IDC_JOBPROPERTIES, TRUE );
79    WinEnableControl( hwnd, DID_OK, TRUE );
80}
81
82void PrintDlg::enumQueues( HWND hwnd )
83{
84    HWND list = WinWindowFromID( hwnd, IDC_PNAME );
85    ULONG cReturned = 0, cTotal = 0, cbNeeded = 0;
86    SPLERR se = SplEnumQueue( NULL, 3, NULL, 0L, &cReturned,
87                              &cTotal, &cbNeeded, NULL );
88    if ( cTotal == 0L ) {
89        // TODO: 'no printers installed' message  (?)
90    }
91
92    pQueueInfo = (PPRQINFO3)malloc( cbNeeded );
93
94    se = SplEnumQueue( NULL, 3, pQueueInfo, cbNeeded, &cReturned,
95                       &cTotal, &cbNeeded, NULL );
96    if ( se != NO_ERROR ) {
97        // TODO: error message
98        free( pQueueInfo );
99        pQueueInfo = NULL;
100        return;
101    }
102
103    USHORT sEntry;
104    for ( ULONG i = 0; i < cReturned; i++ )
105    {
106        sEntry = (SHORT)WinSendMsg( list, LM_INSERTITEM, MPFROMSHORT(LIT_END),
107                                    MPFROMP( pQueueInfo[i].pszComment ) );
108        WinSendMsg( list, LM_SETITEMHANDLE,
109                    MPFROMSHORT(sEntry), MPFROMP( &(pQueueInfo[i]) ) );
110
111        if ( pQueueInfo[i].fsType & PRQ3_TYPE_APPDEFAULT ) {
112            setCurrentQInfo( hwnd, &( pQueueInfo[i] ) );
113        }
114    }
115}
116
117
118void PrintDlg::showJobProperties()
119{
120    if ( psetup->QueueInfo.pszName[0] == 0 ) {
121        return;
122    }
123
124    char achDriverName[ DRIVERNAME_LENGTH ];
125    char achDeviceName[ DEVICENAME_LENGTH ];
126
127    // The pszDriverName is of the form DRIVER.DEVICE (e.g.,
128    // LASERJET.HP LaserJet IID) so we need to separate it at the dot
129    int i = strcspn( psetup->QueueInfo.pszDriverName, "." );
130    if ( i > 0 ) {
131        strncpy( achDriverName, psetup->QueueInfo.pszDriverName, i );
132        achDriverName[ i ] = '\0';
133        strcpy( achDeviceName, &( psetup->QueueInfo.pszDriverName[ i + 1 ] ) );
134    }
135    else {
136        strcpy( achDriverName, psetup->QueueInfo.pszDriverName );
137        *achDeviceName = '\0';
138    }
139
140    // There may be more than one printer assigned to this print queue
141    // We will use the first in the comma separated list.  We would
142    // need an expanded dialog for the user to be more specific.
143    char *pszTemp = strchr( psetup->QueueInfo.pszPrinters, ',' );
144    if ( pszTemp != NULL ) {
145        // Strip off comma and trailing printer names
146        *pszTemp = '\0';
147    }
148
149    // Post the job properties dialog for the printer to allow the
150    // user to modify the options
151    DevPostDeviceModes( hab, psetup->QueueInfo.pDriverData, achDriverName,
152                        achDeviceName, psetup->QueueInfo.pszPrinters, DPDM_POSTJOBPROP );
153}
154
155
156MRESULT EXPENTRY PrintDlg::printDlgProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
157{
158    // This is a static method, so we don't know which instantiation we're
159    // dealing with. But we can get a pseudo-this from the parameter to
160    // WM_INITDLG, which we therafter store with the window and retrieve
161    // as follows:
162    PrintDlg *_this = (PrintDlg *)WinQueryWindowULong( hwnd, QWL_USER );
163
164    switch (msg)
165    {
166
167        // Dialog has just been created
168        case WM_INITDLG:
169        {
170            // Save the mp2 into our user data so that subsequent calls have
171            // access to the parent C++ object
172            WinSetWindowULong( hwnd, QWL_USER, (ULONG)mp2 );
173            _this = (PrintDlg *)mp2;
174            localizeDialog( hwnd );
175            centerWindow( _this->hFrame, hwnd );
176
177            // Enum printer queues
178            _this->enumQueues( hwnd );
179
180            // Print range
181            WinCheckButton( hwnd, IDC_RANGEALL, TRUE );
182
183            // Set the print range spins
184            long pages = _this->doc->getPageCount( ev );
185            WinSendDlgItemMsg( hwnd, IDC_PGFROM, SPBM_SETLIMITS,
186                               MPFROMLONG( pages ), MPFROMLONG( 1 ) );
187            WinSendDlgItemMsg( hwnd, IDC_PGFROM, SPBM_SETCURRENTVALUE,
188                               MPFROMLONG( 1 ), MPVOID );
189            WinSendDlgItemMsg( hwnd, IDC_PGTO, SPBM_SETLIMITS,
190                               MPFROMLONG( pages ), MPFROMLONG( 1 ) );
191            WinSendDlgItemMsg( hwnd, IDC_PGTO, SPBM_SETCURRENTVALUE,
192                               MPFROMLONG( pages ), MPVOID );
193
194            // Set the print type
195            if ( _this->doc->isPostScriptExportable( ev ) ) {
196                WinEnableControl( hwnd, IDC_TYPE_POSTSCRIPT, TRUE );
197                WinCheckButton( hwnd, IDC_TYPE_POSTSCRIPT, TRUE );
198            }
199            else {
200                WinEnableControl( hwnd, IDC_TYPE_POSTSCRIPT, FALSE );
201                WinCheckButton( hwnd, IDC_TYPE_ASIMAGE, TRUE );
202            }
203            WinSendMsg( hwnd, WM_CONTROL,
204                        MPFROM2SHORT( IDC_TYPE_POSTSCRIPT, BN_CLICKED ),
205                        MPFROMHWND( WinWindowFromID( hwnd, IDC_TYPE_POSTSCRIPT ) ) );
206
207
208            return (MRESULT)FALSE;
209        }
210
211        case WM_CONTROL:
212        {
213            switch ( SHORT1FROMMP(mp1) )
214            {
215                case IDC_PNAME:
216                {
217                    if ( SHORT2FROMMP(mp1) == CBN_ENTER )
218                    {
219                        SHORT rc = (SHORT)WinSendDlgItemMsg( hwnd, IDC_PNAME, LM_QUERYSELECTION,
220                                                             MPFROMSHORT( LIT_CURSOR ), MPVOID );
221                        if ( rc != LIT_NONE ) {
222                            MRESULT r = WinSendDlgItemMsg( hwnd, IDC_PNAME, LM_QUERYITEMHANDLE,
223                                                           MPFROMSHORT( rc ), MPVOID );
224                            _this->setCurrentQInfo( hwnd, (PPRQINFO3)r );
225                        }
226                    }
227                }
228                break;
229
230                case IDC_RANGEALL:
231                case IDC_RANGECURRENT:
232                case IDC_RANGEPAGES:
233                {
234                    BOOL en = WinQueryButtonCheckstate( hwnd, IDC_RANGEPAGES );
235                    WinEnableControl( hwnd, IDC_LABELFROM, en );
236                    WinEnableControl( hwnd, IDC_PGFROM, en );
237                    WinEnableControl( hwnd, IDC_LABELTO, en );
238                    WinEnableControl( hwnd, IDC_PGTO, en );
239                }
240                break;
241
242                case IDC_TYPE_POSTSCRIPT:
243                case IDC_TYPE_ASIMAGE:
244                {
245                    WinEnableControl( hwnd, IDC_HIGHER_IMAGE_QUALITY,
246                                WinQueryButtonCheckstate( hwnd, IDC_TYPE_ASIMAGE ) );
247                }
248                break;
249
250            }
251        }
252        break;
253
254        case WM_COMMAND:
255            switch (SHORT1FROMMP(mp1))
256            {
257                case IDC_JOBPROPERTIES:
258                    _this->showJobProperties();
259                    return (MRESULT)FALSE;
260
261                case DID_OK:
262                    {
263                        _this->psetup->range = RangeAll;
264                        _this->psetup->pgfrom = 1;
265                        _this->psetup->pgto = _this->doc->getPageCount( ev );
266
267                        if ( WinQueryButtonCheckstate( hwnd, IDC_RANGECURRENT ) ) {
268                            _this->psetup->range = RangeCurrent;
269                            _this->psetup->pgfrom = _this->currentpage;
270                            _this->psetup->pgto = _this->currentpage;
271                        }
272
273                        if ( WinQueryButtonCheckstate( hwnd, IDC_RANGEPAGES ) )
274                        {
275                            _this->psetup->range = RangePages;
276                            LONG tmpVal = 0;
277                            BOOL rc = (BOOL)WinSendDlgItemMsg( hwnd, IDC_PGFROM, SPBM_QUERYVALUE, MPFROMP( &tmpVal ), MPFROM2SHORT( 0, SPBQ_UPDATEIFVALID ) );
278                            if ( rc && ( tmpVal > 0 ) ) {
279                                _this->psetup->pgfrom = tmpVal;
280                            }
281                            rc = (BOOL)WinSendDlgItemMsg( hwnd, IDC_PGTO, SPBM_QUERYVALUE, MPFROMP( &tmpVal ), MPFROM2SHORT( 0, SPBQ_UPDATEIFVALID ) );
282                            if ( rc && ( tmpVal > 0 ) ) {
283                                _this->psetup->pgto = tmpVal;
284                            }
285                        }
286
287                        _this->psetup->ptype = TypePostScript;
288                        if ( WinQueryButtonCheckstate( hwnd, IDC_TYPE_ASIMAGE ) ) {
289                            _this->psetup->ptype = TypeAsImage;
290                        }
291                        _this->psetup->higherQuality = WinQueryButtonCheckstate( hwnd, IDC_HIGHER_IMAGE_QUALITY );
292
293                        WinDismissDlg( hwnd, DID_OK );
294                    }
295                    return (MRESULT)FALSE;
296
297                case DID_CANCEL:
298                    WinDismissDlg( hwnd, DID_CANCEL );
299                    return (MRESULT)FALSE;
300            };
301            return (MRESULT)FALSE;
302    }
303    return WinDefDlgProc( hwnd, msg, mp1, mp2 );
304}
305
306
Note: See TracBrowser for help on using the repository browser.