Initial release of Maemo 5 port of gnuplot
[gnuplot] / src / os2 / dialogs.c
diff --git a/src/os2/dialogs.c b/src/os2/dialogs.c
new file mode 100644 (file)
index 0000000..229832a
--- /dev/null
@@ -0,0 +1,476 @@
+#ifdef INCRCSDATA
+static char RCSid[]="$Id: dialogs.c,v 1.7 2005/01/04 13:01:34 mikulik Exp $" ;
+#endif
+
+/****************************************************************************
+
+    PROGRAM: gnupmdrv
+
+        Outboard PM driver for GNUPLOT 3.x
+
+    MODULE:  dialogs.c  Dialog procedures for gnupmdrv
+
+****************************************************************************/
+
+/* PM driver for GNUPLOT */
+
+/*[
+ * Copyright 1992, 1993, 1998, 2004   Roger Fearick
+ *
+ * Permission to use, copy, and distribute this software and its
+ * documentation for any purpose with or without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.
+ *
+ * Permission to modify the software is granted, but not the right to
+ * distribute the complete modified source code.  Modifications are to
+ * be distributed as patches to the released version.  Permission to
+ * distribute binaries produced by compiling modified sources is granted,
+ * provided you
+ *   1. distribute the corresponding source modifications from the
+ *    released version in the form of a patch file along with the binaries,
+ *   2. add special version identification to distinguish your version
+ *    in addition to the base release version number,
+ *   3. provide your name and address as the primary contact for the
+ *    support of your modified version, and
+ *   4. retain our contact information in regard to use of the base
+ *    software.
+ * Permission to distribute the released version of the source code along
+ * with corresponding source modifications in the form of a patch file is
+ * granted with same provisions 2 through 4 for binary distributions.
+ *
+ * This software is provided "as is" without express or implied warranty
+ * to the extent permitted by applicable law.
+]*/
+
+/*
+ * AUTHOR
+ *
+ *   Gnuplot driver for OS/2:  Roger Fearick
+ */
+
+#define INCL_PM
+#define INCL_WIN
+#define INCL_DEV
+#define INCL_SPL
+#define INCL_SPLDOSPRINT
+#define INCL_WINDIALOGS
+#define INCL_WINBUTTONS
+#define INCL_WINSYS
+#define INCL_WINFRAMEMGR
+#define INCL_WINPOINTERS
+#define INCL_WINTRACKRECT
+#define INCL_WINENTRYFIELDS
+#define INCL_WINWINDOWMGR
+#include <os2.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "gnupmdrv.h"
+
+/* struct for printer capabilities */
+
+static struct {
+    long    lTech ;     // printer technology
+    long    lVer ;      // driver version
+    long    lWidth ;    // page width in pels
+    long    lHeight ;   // page height in pels
+    long    lWChars ;   // page width in chars
+    long    lHChars ;   // page height in chars
+    long    lHorRes ;   // horizontal resolution pels / metre
+    long    lVertRes ;  // vertical resolution pels / metre
+    } prCaps ;
+
+ULONG GetPrinters( PPRQINFO3* pprq, ULONG *pcTot  ) ;
+
+
+MRESULT EXPENTRY QPrintDlgProc ( HWND hwnd, ULONG usMsg, MPARAM mp1, MPARAM mp2 )
+/*
+**  Query print area and printer setup
+*/
+    {
+    static PQPRINT pqp = NULL ;
+    static SWP     swp ;
+    static RECTL   rectlDef ;
+    TRACKINFO   ti ;
+    RECTL       rectlBox ;
+    HDC         hdc ;
+    ULONG       ulStyle ;
+    char        *psz ;
+
+    switch ( usMsg ) {
+
+        case WM_INITDLG :
+
+            pqp = (PQPRINT) PVOIDFROMMP( mp2 ) ;
+            if( pqp->caps & QP_CAPS_FILE ) {
+                ulStyle = WinQueryWindowULong( WinWindowFromID( hwnd, IDD_PRINTQNAME ),
+                                               QWL_STYLE ) ;
+                WinSetWindowULong( WinWindowFromID( hwnd, IDD_PRINTQNAME ),
+                                   QWL_STYLE, ulStyle ^ DT_HALFTONE  ) ;
+                }
+            else {
+                WinSendMsg( WinWindowFromID( hwnd, IDD_QPRNAME ),
+                            EM_SETREADONLY, (MPARAM)TRUE, 0L ) ;
+                }
+            WinQueryWindowRect( WinWindowFromID( hwnd, IDD_QPRBOX ),
+                                &rectlDef ) ;
+
+        case WM_USER_SET_DATA :
+
+            psz = *pqp->piPrinter->pszComment ? pqp->piPrinter->pszComment :
+                                        pqp->piPrinter->pszName ;
+            WinSetDlgItemText( hwnd, IDD_PRINTNAME, psz ) ;
+            WinSetDlgItemFloatF( hwnd, IDD_QPRXSIZE, 1, pqp->xsize ) ;
+            WinSetDlgItemFloatF( hwnd, IDD_QPRYSIZE, 1, pqp->ysize ) ;
+            WinSetDlgItemFloat( hwnd, IDD_QPRXFRAC, pqp->xfrac ) ;
+            WinSetDlgItemFloat( hwnd, IDD_QPRYFRAC, pqp->yfrac ) ;
+            WinQueryWindowPos( WinWindowFromID( hwnd, IDD_QPRBOX ),
+                               &swp ) ;
+            {
+            int y = rectlDef.yTop ;
+            rectlBox = rectlDef ;
+            if( pqp->xsize < pqp->ysize )
+                rectlBox.xRight = rectlDef.yTop * pqp->xsize/pqp->ysize ;
+            else {
+                int x = rectlDef.yTop * pqp->ysize/pqp->xsize ;
+                rectlBox.yTop = x ;
+                rectlBox.xRight = y ;
+                }
+            }
+            WinSetWindowPos( WinWindowFromID( hwnd, IDD_QPRBOX ),
+                             NULLHANDLE, 0, 0, (short) rectlBox.xRight, (short)rectlBox.yTop, SWP_SIZE ) ;
+            {
+            double ratio = 1.560 ;
+            double xs = rectlBox.xRight - rectlBox.xLeft ;
+            double ys = rectlBox.yTop - rectlBox.yBottom ;
+            if( ys > xs/ratio ) { /* reduce ys to fit */
+                 rectlBox.yTop = rectlBox.yBottom + (int)(xs/ratio) ;
+                 }
+            else if( ys < xs/ratio ) { /* reduce xs to fit */
+                 rectlBox.xRight = rectlBox.xLeft + (int)(ys*ratio) ;
+                 }
+            }
+            rectlBox.xRight *= pqp->xfrac ;
+            rectlBox.yTop *= pqp->yfrac ;
+            WinSetWindowPos( WinWindowFromID( hwnd, IDD_QPRFRAME ),
+                             NULLHANDLE,
+                             swp.x, swp.y, //+(short)(swp.cy*(1.0-pqp->yfrac)),
+                             (short)rectlBox.xRight, (short)rectlBox.yTop, SWP_SIZE|SWP_MOVE ) ;
+            break ;
+
+        case WM_COMMAND :
+
+            switch ( SHORT1FROMMP(mp1) ) {
+
+                case DID_OK:
+                    WinQueryDlgItemFloat( hwnd, IDD_QPRXFRAC, &pqp->xfrac ) ;
+                    WinQueryDlgItemFloat( hwnd, IDD_QPRYFRAC, &pqp->yfrac ) ;
+
+                    if( pqp->caps & QP_CAPS_FILE ) {
+                        WinQueryDlgItemText( hwnd, IDD_QPRNAME, 32, pqp->szFilename ) ;
+                        }
+                    break ;
+
+                case IDD_QPRSETPR:   /* printer setup */
+                    if( SetPrinterMode( hwnd, pqp ) == 1 ) {
+                        if( (hdc = OpenPrinterDC( WinQueryAnchorBlock( hwnd ),
+                                                  pqp,
+                                                  OD_INFO,
+                                                  NULL )) != DEV_ERROR ) {
+                            DevQueryCaps( hdc, CAPS_TECHNOLOGY, (long)sizeof(prCaps)/sizeof(long), (PLONG)&prCaps ) ;
+                            DevCloseDC( hdc ) ;
+                            pqp->xsize = (float)100.0* (float) prCaps.lWidth / (float) prCaps.lHorRes ; // in cm
+                            pqp->ysize = (float)100.0* (float) prCaps.lHeight / (float) prCaps.lVertRes ; // in cm
+                            WinSendMsg( hwnd, WM_USER_SET_DATA, 0L, 0L ) ;
+                            }
+                        }
+                    return 0L ;
+
+                case IDD_QPRTRACK :     /* track plot area */
+                    WinQueryWindowRect( WinWindowFromID( hwnd, IDD_QPRBOX ),
+                                        &rectlBox ) ;
+                    {
+                    double ratio = 1.560 ;
+                    double xs = rectlBox.xRight - rectlBox.xLeft ;
+                    double ys = rectlBox.yTop - rectlBox.yBottom ;
+                    if( ys > xs/ratio ) { /* reduce ys to fit */
+                        rectlBox.yTop = rectlBox.yBottom + (int)(xs/ratio) ;
+                        }
+                    else if( ys < xs/ratio ) { /* reduce xs to fit */
+                        rectlBox.xRight = rectlBox.xLeft + (int)(ys*ratio) ;
+                        }
+                    }
+                    ti.cxBorder = ti.cyBorder = 2 ;
+                    ti.cxGrid = ti.cyGrid = 0 ;
+                    ti.cxKeyboard = ti.cyKeyboard = 2 ;
+                    ti.ptlMinTrackSize.x = ti.ptlMinTrackSize.y = 2 ;
+                    ti.rclBoundary = rectlBox ;
+                    ti.ptlMaxTrackSize.x = rectlBox.xRight ;
+                    ti.ptlMaxTrackSize.y = rectlBox.yTop ;
+                    ti.rclTrack.xRight = pqp->xfrac * rectlBox.xRight ;
+                    ti.rclTrack.yTop = pqp->yfrac*rectlBox.yTop ;
+                    ti.rclTrack.xLeft = 0 ;
+                    ti.rclTrack.yBottom = 0 ;//(1.0-pqp->yfrac) * rectlBox.yTop ;
+                    ti.fs = TF_RIGHT|TF_TOP|TF_STANDARD|TF_SETPOINTERPOS|TF_ALLINBOUNDARY ;
+                    WinSetPointer( HWND_DESKTOP,
+                                   WinQuerySysPointer( HWND_DESKTOP, SPTR_SIZENWSE, FALSE ) ) ;
+                    WinTrackRect( WinWindowFromID( hwnd, IDD_QPRBOX ),
+                                  NULLHANDLE,
+                                  &ti ) ;
+                    pqp->xfrac = (float)ti.rclTrack.xRight / (float)rectlBox.xRight ;
+                    pqp->yfrac = ((float)(ti.rclTrack.yTop-ti.rclTrack.yBottom) / (float)rectlBox.yTop) ;
+                    rectlBox.yTop = ti.rclTrack.yTop - ti.rclTrack.yBottom ;
+                    rectlBox.xRight = ti.rclTrack.xRight ;
+                    {
+                    double ratio = 1.560 ;
+                    double xs = rectlBox.xRight - rectlBox.xLeft ;
+                    double ys = rectlBox.yTop - rectlBox.yBottom ;
+                    if( ys > xs/ratio ) { /* reduce ys to fit */
+                        rectlBox.yTop = rectlBox.yBottom + (int)(xs/ratio) ;
+                        }
+                    else if( ys < xs/ratio ) { /* reduce xs to fit */
+                        rectlBox.xRight = rectlBox.xLeft + (int)(ys*ratio) ;
+                        }
+                    }
+                    WinSetWindowPos( WinWindowFromID( hwnd, IDD_QPRFRAME ),
+                                     NULLHANDLE,
+                                     swp.x, swp.y,//+(short)(swp.cy*(1.0-pqp->yfrac)),
+                                     (short)rectlBox.xRight, (short)rectlBox.yTop, SWP_SIZE|SWP_MOVE ) ;
+                    WinSetDlgItemFloat( hwnd, IDD_QPRXFRAC, pqp->xfrac ) ;
+                    WinSetDlgItemFloat( hwnd, IDD_QPRYFRAC, pqp->yfrac ) ;
+                    return 0L ;
+
+                default:
+                    break ;
+                }
+
+         default:
+            break ;
+            }
+        /* fall through to the default control processing */
+
+    return WinDefDlgProc ( hwnd , usMsg , mp1 , mp2 ) ;
+    }
+
+MRESULT EXPENTRY QPrintersDlgProc ( HWND hwnd, ULONG usMsg, MPARAM mp1, MPARAM mp2 )
+/*
+**  Query printers and allow selection
+*/
+    {
+    static HWND hwndLB ;
+    static PPRQINFO3 pprq=NULL ;
+    static ULONG cPrinters ;
+    static USHORT usItem ;
+    static char *szPrinterName ;
+    int i, iSelect ;
+    char *psz ;
+
+    switch ( usMsg ) {
+
+        case WM_INITDLG :
+
+            szPrinterName = (char*) PVOIDFROMMP( mp2 ) ;
+            iSelect = 0 ;
+            GetPrinters( &pprq, &cPrinters ) ;
+            hwndLB = WinWindowFromID( hwnd, IDD_QPRSLIST ) ;
+            for( i=0; i<cPrinters;i++ ) {
+                psz = *pprq[i].pszComment ? pprq[i].pszComment :
+                                            pprq[i].pszName ;
+                WinSendMsg( hwndLB,
+                            LM_INSERTITEM,
+                            (MPARAM)LIT_END,
+                            MPFROMP(psz) ) ;
+                if( strcmp( pprq[i].pszName, szPrinterName ) == 0 )
+                    iSelect = i ;
+                }
+
+            WinSendMsg( hwndLB,
+                        LM_SELECTITEM,
+                        MPFROMSHORT( iSelect ),
+                        (MPARAM)TRUE ) ;
+
+            break ;
+
+        case WM_COMMAND :
+
+            switch ( SHORT1FROMMP(mp1) ) {
+
+                case DID_OK:
+                    strcpy( szPrinterName, pprq[usItem].pszName ) ;
+                case DID_CANCEL:
+                    free( pprq ) ;
+                    pprq = NULL;
+                    break ;
+                }
+            break ;
+
+        case WM_CONTROL:
+
+            if( SHORT1FROMMP( mp1 ) == IDD_QPRSLIST ) {
+                if( SHORT2FROMMP( mp1 ) == LN_SELECT  ) {
+                    usItem = (ULONG)WinSendMsg( hwndLB,
+                                LM_QUERYSELECTION,
+                                0L,
+                                0L ) ;
+                    }
+                }
+
+        default:
+            break ;
+        }
+        /* fall through to the default control processing */
+    return WinDefDlgProc ( hwnd , usMsg , mp1 , mp2 ) ;
+    }
+
+ULONG GetPrinters( PPRQINFO3 *pprq, ULONG *pcTot  )
+/*
+** get a list of printers
+*/
+    {
+    ULONG rc ;
+    ULONG cQueues, cbData ;
+
+    rc = SplEnumQueue( NULL, 3, NULL, 0, &cQueues, pcTot, &cbData, NULL ) ;
+
+    if( *pprq != NULL ) {
+        free( *pprq ) ;
+        *pprq = NULL ;
+        }
+    if( *pcTot == 0 ) { /* no printers */
+        return 0 ;
+        }
+    *pprq = malloc( cbData ) ;
+    rc = SplEnumQueue( NULL,
+                       3,
+                       *pprq,
+                       cbData,
+                       &cQueues,
+                       pcTot,
+                       &cbData,
+                       NULL ) ;
+    return *pcTot ;
+    }
+
+MRESULT EXPENTRY PauseMsgDlgProc ( HWND hwnd, ULONG usMsg, MPARAM mp1, MPARAM mp2 )
+/*
+**  Pause message dialog box proc
+*/
+    {
+    static PPAUSEDATA ppdata = NULL ;
+    char *pszText ;
+    switch ( usMsg ) {
+
+        case WM_INITDLG :
+                /* set the position so user can move out the way, and
+                   have it come back there next time */
+            ppdata = (PPAUSEDATA) PVOIDFROMMP( mp2 ) ;
+            if( ppdata->pswp != NULL )
+                WinSetWindowPos( hwnd, HWND_TOP, ppdata->pswp->x, ppdata->pswp->y,
+                                 0, 0, SWP_MOVE ) ;
+            pszText = ppdata->pszMessage ;
+            while(*pszText==' ') ++pszText ;
+            WinSetDlgItemText( hwnd, IDD_PAUSETEXT, pszText ) ;
+            break ;
+
+        case WM_COMMAND :
+            switch ( SHORT1FROMMP(mp1) ) {
+                case DID_OK:
+                case DID_CANCEL:
+                    WinPostMsg( WinQueryWindow( hwnd, QW_OWNER ),
+                                WM_PAUSEEND,
+                                SHORT1FROMMP(mp1)==DID_OK?(MPARAM)1L:0L,
+                                0L ) ;
+                    if( ppdata->pswp == NULL ) ppdata->pswp = (PSWP)malloc( sizeof(SWP) ) ;
+                    WinQueryWindowPos( hwnd, ppdata->pswp ) ;
+                    WinDismissDlg( hwnd, 0 ) ;
+                    break ;
+                case IDM_PRINT:
+                    WinPostMsg( WinQueryWindow( hwnd, QW_OWNER ),
+                                WM_COMMAND,
+                                MPFROMSHORT(IDM_PRINT),
+                                0L ) ;
+                    return 0 ;
+                default:
+                    break ;
+                }
+        default:
+            break ;
+        }
+        /* fall through to the default control processing */
+    return WinDefDlgProc ( hwnd , usMsg , mp1 , mp2 ) ;
+    }
+
+void WinSetDlgItemFloatF( HWND hwnd, USHORT usID, int nDec, float flValue )
+/*
+*/
+    {
+    char achBuffer [ 34 ]; // default string field size ...
+    char fmt[32] ;
+
+    sprintf( fmt, "%%12.%df", nDec ) ;
+    sprintf( achBuffer, fmt, flValue ) ;
+    WinSetDlgItemText( hwnd, usID, achBuffer ) ;
+    }
+
+void WinSetDlgItemFloat( HWND hwnd, USHORT usID, float flValue )
+/*
+*/
+    {
+    char achBuffer [ 34 ] ; // default string field size ...
+    char fmt[10] ;
+
+    sprintf( fmt, "%%12.%df", 4 ) ;
+    sprintf( achBuffer, fmt, flValue ) ;
+    WinSetDlgItemText( hwnd, usID, achBuffer ) ;
+    WinSetDlgItemText( hwnd, usID, achBuffer ) ;
+    }
+
+void WinQueryDlgItemFloat( HWND hwnd, USHORT usID, float *pflValue )
+/*
+*/
+    {
+    char achBuffer [ 34 ] ; // default string field size ...
+
+    WinQueryDlgItemText( hwnd, usID, 34, achBuffer ) ;
+    *pflValue = (float) atof( achBuffer ) ;
+    }
+
+MRESULT EXPENTRY SendCommandDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+/*
+**  Dialog for sending a command to gnuplot
+**  //PM Petr Mikulik, 17. 8. 1999
+*/
+{
+#define TEXT_LENGTH 80
+static char buf[TEXT_LENGTH+1];
+extern void gp_execute (char *s);
+
+  switch (msg)
+    {
+    case WM_INITDLG:
+      WinSendDlgItemMsg( hwnd, IDM_DO_SENDCOMMAND, EM_SETTEXTLIMIT,
+                         MPFROMSHORT (TEXT_LENGTH), 0L );
+      WinSetDlgItemText( hwnd, IDM_DO_SENDCOMMAND, buf );
+      WinSendDlgItemMsg( hwnd, IDM_DO_SENDCOMMAND, EM_SETSEL,
+                         MPFROM2SHORT (0, strlen(buf)), 0L );
+      return (MRESULT)FALSE;
+
+    case WM_COMMAND:
+      switch (COMMANDMSG (&msg)->cmd)
+        {
+        case DID_OK:
+          WinQueryDlgItemText( hwnd, IDM_DO_SENDCOMMAND, sizeof(buf), buf );
+          WinDismissDlg( hwnd, TRUE );
+         gp_execute(buf);
+          break;
+        default:
+          WinDismissDlg( hwnd, FALSE );
+          break;
+        }
+      return 0;
+    }
+  return ( WinDefDlgProc( hwnd, msg, mp1, mp2 ) );
+}