Annotation of OpenXM_contrib/gnuplot/os2/dialogs.c, Revision 1.1.1.1
1.1 maekawa 1: #ifdef INCRCSDATA
2: static char RCSid[]="$Id: dialogs.c,v 1.9 1998/03/22 22:34:20 drd Exp $" ;
3: #endif
4:
5: /****************************************************************************
6:
7: PROGRAM: gnupmdrv
8:
9: Outboard PM driver for GNUPLOT 3.3
10:
11: MODULE: dialogs.c Dialog procedures for gnupmdrv
12:
13: ****************************************************************************/
14:
15: /* PM driver for GNUPLOT */
16:
17: /*[
18: * Copyright 1992, 1993, 1998 Roger Fearick
19: *
20: * Permission to use, copy, and distribute this software and its
21: * documentation for any purpose with or without fee is hereby granted,
22: * provided that the above copyright notice appear in all copies and
23: * that both that copyright notice and this permission notice appear
24: * in supporting documentation.
25: *
26: * Permission to modify the software is granted, but not the right to
27: * distribute the complete modified source code. Modifications are to
28: * be distributed as patches to the released version. Permission to
29: * distribute binaries produced by compiling modified sources is granted,
30: * provided you
31: * 1. distribute the corresponding source modifications from the
32: * released version in the form of a patch file along with the binaries,
33: * 2. add special version identification to distinguish your version
34: * in addition to the base release version number,
35: * 3. provide your name and address as the primary contact for the
36: * support of your modified version, and
37: * 4. retain our contact information in regard to use of the base
38: * software.
39: * Permission to distribute the released version of the source code along
40: * with corresponding source modifications in the form of a patch file is
41: * granted with same provisions 2 through 4 for binary distributions.
42: *
43: * This software is provided "as is" without express or implied warranty
44: * to the extent permitted by applicable law.
45: ]*/
46:
47: /*
48: * AUTHOR
49: *
50: * Gnuplot driver for OS/2: Roger Fearick
51: *
52: * Send your comments or suggestions to
53: * info-gnuplot@dartmouth.edu.
54: * This is a mailing list; to join it send a note to
55: * majordomo@dartmouth.edu.
56: * Send bug reports to
57: * bug-gnuplot@dartmouth.edu.
58: **/
59:
60: #define INCL_PM
61: #define INCL_WIN
62: #define INCL_DEV
63: #define INCL_SPL
64: #define INCL_SPLDOSPRINT
65: #define INCL_WINDIALOGS
66: #define INCL_WINBUTTONS
67: #define INCL_WINSYS
68: #define INCL_WINFRAMEMGR
69: #define INCL_WINPOINTERS
70: #define INCL_WINTRACKRECT
71: #define INCL_WINENTRYFIELDS
72: #define INCL_WINWINDOWMGR
73: #include <os2.h>
74: #include <math.h>
75: #include <stdio.h>
76: #include <stdlib.h>
77: #include <string.h>
78: #include "gnupmdrv.h"
79:
80: /* struct for printer capabilities */
81:
82: static struct {
83: long lTech ; // printer technology
84: long lVer ; // driver version
85: long lWidth ; // page width in pels
86: long lHeight ; // page height in pels
87: long lWChars ; // page width in chars
88: long lHChars ; // page height in chars
89: long lHorRes ; // horizontal resolution pels / metre
90: long lVertRes ; // vertical resolution pels / metre
91: } prCaps ;
92:
93: ULONG GetPrinters( PPRQINFO3* pprq, ULONG *pcTot ) ;
94:
95:
96: MRESULT EXPENTRY QPrintDlgProc ( HWND hwnd, ULONG usMsg, MPARAM mp1, MPARAM mp2 )
97: /*
98: ** Query print area and printer setup
99: */
100: {
101: static PQPRINT pqp = NULL ;
102: static SWP swp ;
103: static RECTL rectlDef ;
104: TRACKINFO ti ;
105: RECTL rectlBox ;
106: HDC hdc ;
107: ULONG ulStyle ;
108: char *psz ;
109:
110: switch ( usMsg ) {
111:
112: case WM_INITDLG :
113:
114: pqp = (PQPRINT) PVOIDFROMMP( mp2 ) ;
115: if( pqp->caps & QP_CAPS_FILE ) {
116: ulStyle = WinQueryWindowULong( WinWindowFromID( hwnd, IDD_PRINTQNAME ),
117: QWL_STYLE ) ;
118: WinSetWindowULong( WinWindowFromID( hwnd, IDD_PRINTQNAME ),
119: QWL_STYLE, ulStyle ^ DT_HALFTONE ) ;
120: }
121: else {
122: WinSendMsg( WinWindowFromID( hwnd, IDD_QPRNAME ),
123: EM_SETREADONLY, (MPARAM)TRUE, 0L ) ;
124: }
125: WinQueryWindowRect( WinWindowFromID( hwnd, IDD_QPRBOX ),
126: &rectlDef ) ;
127:
128: case WM_USER_SET_DATA :
129:
130: psz = *pqp->piPrinter->pszComment ? pqp->piPrinter->pszComment :
131: pqp->piPrinter->pszName ;
132: WinSetDlgItemText( hwnd, IDD_PRINTNAME, psz ) ;
133: WinSetDlgItemFloatF( hwnd, IDD_QPRXSIZE, 1, pqp->xsize ) ;
134: WinSetDlgItemFloatF( hwnd, IDD_QPRYSIZE, 1, pqp->ysize ) ;
135: WinSetDlgItemFloat( hwnd, IDD_QPRXFRAC, pqp->xfrac ) ;
136: WinSetDlgItemFloat( hwnd, IDD_QPRYFRAC, pqp->yfrac ) ;
137: WinQueryWindowPos( WinWindowFromID( hwnd, IDD_QPRBOX ),
138: &swp ) ;
139: {
140: int y = rectlDef.yTop ;
141: rectlBox = rectlDef ;
142: if( pqp->xsize < pqp->ysize )
143: rectlBox.xRight = rectlDef.yTop * pqp->xsize/pqp->ysize ;
144: else {
145: int x = rectlDef.yTop * pqp->ysize/pqp->xsize ;
146: rectlBox.yTop = x ;
147: rectlBox.xRight = y ;
148: }
149: }
150: WinSetWindowPos( WinWindowFromID( hwnd, IDD_QPRBOX ),
151: NULLHANDLE, 0, 0, (short) rectlBox.xRight, (short)rectlBox.yTop, SWP_SIZE ) ;
152: {
153: double ratio = 1.560 ;
154: double xs = rectlBox.xRight - rectlBox.xLeft ;
155: double ys = rectlBox.yTop - rectlBox.yBottom ;
156: if( ys > xs/ratio ) { /* reduce ys to fit */
157: rectlBox.yTop = rectlBox.yBottom + (int)(xs/ratio) ;
158: }
159: else if( ys < xs/ratio ) { /* reduce xs to fit */
160: rectlBox.xRight = rectlBox.xLeft + (int)(ys*ratio) ;
161: }
162: }
163: rectlBox.xRight *= pqp->xfrac ;
164: rectlBox.yTop *= pqp->yfrac ;
165: WinSetWindowPos( WinWindowFromID( hwnd, IDD_QPRFRAME ),
166: NULLHANDLE,
167: swp.x, swp.y, //+(short)(swp.cy*(1.0-pqp->yfrac)),
168: (short)rectlBox.xRight, (short)rectlBox.yTop, SWP_SIZE|SWP_MOVE ) ;
169: break ;
170:
171: case WM_COMMAND :
172:
173: switch ( SHORT1FROMMP(mp1) ) {
174:
175: case DID_OK:
176: WinQueryDlgItemFloat( hwnd, IDD_QPRXFRAC, &pqp->xfrac ) ;
177: WinQueryDlgItemFloat( hwnd, IDD_QPRYFRAC, &pqp->yfrac ) ;
178:
179: if( pqp->caps & QP_CAPS_FILE ) {
180: WinQueryDlgItemText( hwnd, IDD_QPRNAME, 32, pqp->szFilename ) ;
181: }
182: break ;
183:
184: case IDD_QPRSETPR: /* printer setup */
185: if( SetPrinterMode( hwnd, pqp ) == 1 ) {
186: if( (hdc = OpenPrinterDC( WinQueryAnchorBlock( hwnd ),
187: pqp,
188: OD_INFO,
189: NULL )) != DEV_ERROR ) {
190: DevQueryCaps( hdc, CAPS_TECHNOLOGY, (long)sizeof(prCaps)/sizeof(long), (PLONG)&prCaps ) ;
191: DevCloseDC( hdc ) ;
192: pqp->xsize = (float)100.0* (float) prCaps.lWidth / (float) prCaps.lHorRes ; // in cm
193: pqp->ysize = (float)100.0* (float) prCaps.lHeight / (float) prCaps.lVertRes ; // in cm
194: WinSendMsg( hwnd, WM_USER_SET_DATA, 0L, 0L ) ;
195: }
196: }
197: return 0L ;
198:
199: case IDD_QPRTRACK : /* track plot area */
200: WinQueryWindowRect( WinWindowFromID( hwnd, IDD_QPRBOX ),
201: &rectlBox ) ;
202: {
203: double ratio = 1.560 ;
204: double xs = rectlBox.xRight - rectlBox.xLeft ;
205: double ys = rectlBox.yTop - rectlBox.yBottom ;
206: if( ys > xs/ratio ) { /* reduce ys to fit */
207: rectlBox.yTop = rectlBox.yBottom + (int)(xs/ratio) ;
208: }
209: else if( ys < xs/ratio ) { /* reduce xs to fit */
210: rectlBox.xRight = rectlBox.xLeft + (int)(ys*ratio) ;
211: }
212: }
213: ti.cxBorder = ti.cyBorder = 2 ;
214: ti.cxGrid = ti.cyGrid = 0 ;
215: ti.cxKeyboard = ti.cyKeyboard = 2 ;
216: ti.ptlMinTrackSize.x = ti.ptlMinTrackSize.y = 2 ;
217: ti.rclBoundary = rectlBox ;
218: ti.ptlMaxTrackSize.x = rectlBox.xRight ;
219: ti.ptlMaxTrackSize.y = rectlBox.yTop ;
220: ti.rclTrack.xRight = pqp->xfrac * rectlBox.xRight ;
221: ti.rclTrack.yTop = pqp->yfrac*rectlBox.yTop ;
222: ti.rclTrack.xLeft = 0 ;
223: ti.rclTrack.yBottom = 0 ;//(1.0-pqp->yfrac) * rectlBox.yTop ;
224: ti.fs = TF_RIGHT|TF_TOP|TF_STANDARD|TF_SETPOINTERPOS|TF_ALLINBOUNDARY ;
225: WinSetPointer( HWND_DESKTOP,
226: WinQuerySysPointer( HWND_DESKTOP, SPTR_SIZENWSE, FALSE ) ) ;
227: WinTrackRect( WinWindowFromID( hwnd, IDD_QPRBOX ),
228: NULLHANDLE,
229: &ti ) ;
230: pqp->xfrac = (float)ti.rclTrack.xRight / (float)rectlBox.xRight ;
231: pqp->yfrac = ((float)(ti.rclTrack.yTop-ti.rclTrack.yBottom) / (float)rectlBox.yTop) ;
232: rectlBox.yTop = ti.rclTrack.yTop - ti.rclTrack.yBottom ;
233: rectlBox.xRight = ti.rclTrack.xRight ;
234: {
235: double ratio = 1.560 ;
236: double xs = rectlBox.xRight - rectlBox.xLeft ;
237: double ys = rectlBox.yTop - rectlBox.yBottom ;
238: if( ys > xs/ratio ) { /* reduce ys to fit */
239: rectlBox.yTop = rectlBox.yBottom + (int)(xs/ratio) ;
240: }
241: else if( ys < xs/ratio ) { /* reduce xs to fit */
242: rectlBox.xRight = rectlBox.xLeft + (int)(ys*ratio) ;
243: }
244: }
245: WinSetWindowPos( WinWindowFromID( hwnd, IDD_QPRFRAME ),
246: NULLHANDLE,
247: swp.x, swp.y,//+(short)(swp.cy*(1.0-pqp->yfrac)),
248: (short)rectlBox.xRight, (short)rectlBox.yTop, SWP_SIZE|SWP_MOVE ) ;
249: WinSetDlgItemFloat( hwnd, IDD_QPRXFRAC, pqp->xfrac ) ;
250: WinSetDlgItemFloat( hwnd, IDD_QPRYFRAC, pqp->yfrac ) ;
251: return 0L ;
252:
253: default:
254: break ;
255: }
256:
257: default:
258: break ;
259: }
260: /* fall through to the default control processing */
261:
262: return WinDefDlgProc ( hwnd , usMsg , mp1 , mp2 ) ;
263: }
264:
265: MRESULT EXPENTRY QPrintersDlgProc ( HWND hwnd, ULONG usMsg, MPARAM mp1, MPARAM mp2 )
266: /*
267: ** Query printers and allow selection
268: */
269: {
270: static HWND hwndLB ;
271: static PPRQINFO3 pprq=NULL ;
272: static ULONG cPrinters ;
273: static USHORT usItem ;
274: static char *szPrinterName ;
275: int i, iSelect ;
276: char *psz ;
277:
278: switch ( usMsg ) {
279:
280: case WM_INITDLG :
281:
282: szPrinterName = (char*) PVOIDFROMMP( mp2 ) ;
283: iSelect = 0 ;
284: GetPrinters( &pprq, &cPrinters ) ;
285: hwndLB = WinWindowFromID( hwnd, IDD_QPRSLIST ) ;
286: for( i=0; i<cPrinters;i++ ) {
287: psz = *pprq[i].pszComment ? pprq[i].pszComment :
288: pprq[i].pszName ;
289: WinSendMsg( hwndLB,
290: LM_INSERTITEM,
291: (MPARAM)LIT_END,
292: MPFROMP(psz) ) ;
293: if( strcmp( pprq[i].pszName, szPrinterName ) == 0 )
294: iSelect = i ;
295: }
296:
297: WinSendMsg( hwndLB,
298: LM_SELECTITEM,
299: MPFROMSHORT( iSelect ),
300: (MPARAM)TRUE ) ;
301:
302: break ;
303:
304: case WM_COMMAND :
305:
306: switch ( SHORT1FROMMP(mp1) ) {
307:
308: case DID_OK:
309: strcpy( szPrinterName, pprq[usItem].pszName ) ;
310: case DID_CANCEL:
311: free( pprq ) ;
312: pprq = NULL;
313: break ;
314: }
315: break ;
316:
317: case WM_CONTROL:
318:
319: if( SHORT1FROMMP( mp1 ) == IDD_QPRSLIST ) {
320: if( SHORT2FROMMP( mp1 ) == LN_SELECT ) {
321: usItem = (ULONG)WinSendMsg( hwndLB,
322: LM_QUERYSELECTION,
323: 0L,
324: 0L ) ;
325: }
326: }
327:
328: default:
329: break ;
330: }
331: /* fall through to the default control processing */
332: return WinDefDlgProc ( hwnd , usMsg , mp1 , mp2 ) ;
333: }
334:
335: ULONG GetPrinters( PPRQINFO3 *pprq, ULONG *pcTot )
336: /*
337: ** get a list of printers
338: */
339: {
340: ULONG rc ;
341: ULONG cQueues, cbData ;
342:
343: rc = SplEnumQueue( NULL, 3, NULL, 0, &cQueues, pcTot, &cbData, NULL ) ;
344:
345: if( *pprq != NULL ) {
346: free( *pprq ) ;
347: *pprq = NULL ;
348: }
349: if( *pcTot == 0 ) { /* no printers */
350: return 0 ;
351: }
352: *pprq = malloc( cbData ) ;
353: rc = SplEnumQueue( NULL,
354: 3,
355: *pprq,
356: cbData,
357: &cQueues,
358: pcTot,
359: &cbData,
360: NULL ) ;
361: return *pcTot ;
362: }
363:
364: MRESULT EXPENTRY PauseMsgDlgProc ( HWND hwnd, ULONG usMsg, MPARAM mp1, MPARAM mp2 )
365: /*
366: ** Pause message dialog box proc
367: */
368: {
369: static PPAUSEDATA ppdata = NULL ;
370: char *pszText ;
371: switch ( usMsg ) {
372:
373: case WM_INITDLG :
374: /* set the position so user can move out the way, and
375: have it come back there next time */
376: ppdata = (PPAUSEDATA) PVOIDFROMMP( mp2 ) ;
377: if( ppdata->pswp != NULL )
378: WinSetWindowPos( hwnd, HWND_TOP, ppdata->pswp->x, ppdata->pswp->y,
379: 0, 0, SWP_MOVE ) ;
380: pszText = ppdata->pszMessage ;
381: while(*pszText==' ') ++pszText ;
382: WinSetDlgItemText( hwnd, IDD_PAUSETEXT, pszText ) ;
383: break ;
384:
385: case WM_COMMAND :
386: switch ( SHORT1FROMMP(mp1) ) {
387: case DID_OK:
388: case DID_CANCEL:
389: WinPostMsg( WinQueryWindow( hwnd, QW_OWNER ),
390: WM_PAUSEEND,
391: SHORT1FROMMP(mp1)==DID_OK?(MPARAM)1L:0L,
392: 0L ) ;
393: if( ppdata->pswp == NULL ) ppdata->pswp = (PSWP)malloc( sizeof(SWP) ) ;
394: WinQueryWindowPos( hwnd, ppdata->pswp ) ;
395: WinDismissDlg( hwnd, 0 ) ;
396: break ;
397: case IDM_PRINT:
398: WinPostMsg( WinQueryWindow( hwnd, QW_OWNER ),
399: WM_COMMAND,
400: MPFROMSHORT(IDM_PRINT),
401: 0L ) ;
402: return 0 ;
403: default:
404: break ;
405: }
406: default:
407: break ;
408: }
409: /* fall through to the default control processing */
410: return WinDefDlgProc ( hwnd , usMsg , mp1 , mp2 ) ;
411: }
412:
413: void WinSetDlgItemFloatF( HWND hwnd, USHORT usID, int nDec, float flValue )
414: /*
415: */
416: {
417: char achBuffer [ 34 ], *szCvt ; // default string field size ...
418: int iDec ;
419: int iSign ;
420: char fmt[32] ;
421: sprintf( fmt, "%%12.%df", nDec ) ;
422: sprintf( achBuffer, fmt, flValue ) ;
423: WinSetDlgItemText( hwnd, usID, achBuffer ) ;
424: }
425:
426: void WinSetDlgItemFloat( HWND hwnd, USHORT usID, float flValue )
427: /*
428: */
429: {
430: char achBuffer [ 34 ] ; // default string field size ...
431: char fmt[10] ;
432: sprintf( fmt, "%%12.%df", 4 ) ;
433: sprintf( achBuffer, fmt, flValue ) ;
434: WinSetDlgItemText( hwnd, usID, achBuffer ) ;
435: WinSetDlgItemText( hwnd, usID, achBuffer ) ;
436: }
437:
438: void WinQueryDlgItemFloat( HWND hwnd, USHORT usID, float *pflValue )
439: /*
440: */
441: {
442: char achBuffer [ 34 ] ; // default string field size ...
443: ULONG ulTemp ;
444:
445: WinQueryDlgItemText( hwnd, usID, 34, achBuffer ) ;
446: *pflValue = (float) atof( achBuffer ) ;
447: }
448:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>