home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / yacl-012.zip / ui / printjob.cxx < prev    next >
C/C++ Source or Header  |  1995-04-09  |  5KB  |  187 lines

  1.  
  2.  
  3. #if defined(__GNUC__)
  4. #pragma implementation
  5. #endif
  6.  
  7.  
  8. #if defined(__MS_WINDOWS__)
  9. #include <windows.h>
  10. #elif defined(__OS2__)
  11. #include <string.h>
  12. #endif
  13.  
  14.  
  15. #include "base/strgseq.h"
  16. #include "ui/printjob.h"
  17. #include "ui/applic.h"
  18. #include "ui/cntroler.h"
  19.  
  20. UI_PrintJob::UI_PrintJob (const char* jobName)
  21. {
  22. #if defined(__MS_WINDOWS__)
  23.     char printer[80];
  24.     GetProfileString("windows", "device", "", printer, sizeof(printer) - 1);
  25.     CL_String printerString (printer);
  26.     CL_String device = printerString.Field (1, ",");
  27.     CL_String driver = printerString.Field (2, ",");
  28.     CL_String port   = printerString.Field (3, ",");
  29.     _handle  = CreateDC (driver.AsPtr(), device.AsPtr(), port.AsPtr(), NULL);
  30.     if (!_handle) {
  31.         CL_Error::Warning ("UI_PrintJob constructor: printer init failed");
  32.         return;
  33.     }
  34.     _horzPPM = ((float) GetDeviceCaps (_handle, LOGPIXELSX)) / 25.4;
  35.     _vertPPM = ((float) GetDeviceCaps (_handle, LOGPIXELSY)) / 25.4;
  36.     _horzPixels = GetDeviceCaps (_handle, HORZRES);
  37.     _vertPixels = GetDeviceCaps (_handle, VERTRES);
  38.     DOCINFO docInfo;
  39.     docInfo.cbSize = sizeof (DOCINFO);
  40.     docInfo.lpszDocName = jobName;
  41.     docInfo.lpszOutput  = NULL;
  42.     StartDoc (_handle, &docInfo);
  43.     StartPage (_handle);
  44.     _brush  = new UI_Brush (this, UI_Color (UIColor_White), UIBrush_Solid);
  45.     _pen    = new UI_Pen   (this);
  46. #elif defined(__OS2__)
  47.     _handle = 0;
  48.     char     printerData[256];
  49.     static DRIVDATA driv = { sizeof (DRIVDATA) } ;
  50.     char     printerName[34];
  51.     DEVOPENSTRUC    dop ;
  52.  
  53.     // Get printer name
  54.     PrfQueryProfileString (HINI_PROFILE, "PM_SPOOLER",
  55.                            "PRINTER", ";",
  56.                            printerName, sizeof printerName) ;
  57.     CL_String printer (printerName);
  58.     printer.Replace (";", "");
  59.  
  60.     // Get printer data
  61.     PrfQueryProfileString (HINI_PROFILE, "PM_SPOOLER_PRINTER",
  62.                            printer.AsPtr(), ";;;;",
  63.                            printerData, sizeof printerData) ;
  64.  
  65.     CL_StringSequence seq = CL_String (printerData).Split (';');
  66.     if (seq.Size() <= 0)
  67.           return;
  68.     dop.pszLogAddress = (char*) seq[2].AsPtr();
  69.     CL_String driver  = seq[1];
  70.  
  71.     short n = driver.CharIndex ('.');
  72.     if (n >= 0) {
  73.         // (pchDelimiter = strchr (dop.pszDriverName, '.')) != NULL) {
  74.         driver = seq[1] (0, n);
  75.         CL_String suffix = seq[1].Suffix (n + 1);
  76.         strncpy (driv.szDeviceName, suffix.AsPtr(),
  77.                  sizeof (driv.szDeviceName)) ;
  78.         dop.pdriv = &driv ;
  79.     }
  80.     else
  81.         dop.pdriv = NULL ;
  82.  
  83.     dop.pszDriverName         = (char*) driver.AsPtr();
  84.     dop.pszDataType           = "PM_Q_STD" ;
  85.     HAB hab  = _TheApplication->Controller().AnchorBlockHandle();
  86.     _printDC = DevOpenDC (hab, OD_QUEUED, "*", 4L, (PDEVOPENDATA) &dop, 0L);
  87.     if (_printDC) {
  88.         SIZEL pageSize = {0, 0};
  89.         _handle = GpiCreatePS (hab, _printDC, &pageSize,
  90.                                PU_ARBITRARY | GPIF_DEFAULT | GPIT_MICRO |
  91.                                GPIA_ASSOC);
  92.         GpiQueryPS (_handle, &_drawingArea);
  93.     };
  94.         
  95.     
  96.     long result = DevEscape (_printDC, DEVESC_STARTDOC, strlen (jobName),
  97.                              (char*) jobName, NULL, NULL);
  98.     if (!result)
  99.         return;
  100.     _brush  = new UI_Brush (this, UIColor_White, UIBrush_Solid);
  101.     _pen    = new UI_Pen   (this);
  102. #endif
  103.     _font = new UI_Font (this);
  104. }
  105.  
  106. UI_PrintJob::~UI_PrintJob ()
  107. {
  108. #if defined(__MS_WINDOWS__)
  109.     EndPage    (_handle);
  110.     EndDoc     (_handle);
  111.     DeleteDC   (_handle);
  112. #elif defined(__OS2__)
  113.     DevEscape (_printDC, DEVESC_NEWFRAME, 0L, NULL, NULL, NULL);
  114.     DevEscape (_printDC, DEVESC_ENDDOC,   0L, NULL, NULL, NULL);
  115.     GpiDestroyPS (_handle);
  116.     DevCloseDC   (_printDC);
  117. #endif
  118. }
  119.  
  120. bool UI_PrintJob::StartNewPage ()
  121. {
  122. #if defined(__MS_WINDOWS__)
  123.     EndPage   (_handle);
  124.     StartPage (_handle);
  125.     return TRUE;
  126. #elif defined(__OS2__)
  127.     return DevEscape (_printDC, DEVESC_NEWFRAME, 0L, NULL, NULL, NULL);
  128. #endif
  129. }
  130.  
  131.  
  132.  
  133. // 
  134. // Query:
  135. //     
  136.  
  137. double UI_PrintJob::HorzPixelsPerMM () const
  138. {
  139.     return _horzPPM;
  140. }
  141.  
  142.  
  143. double UI_PrintJob::VertPixelsPerMM () const
  144. {
  145.     return _vertPPM;
  146. }
  147.  
  148.  
  149.  
  150. UI_Rectangle UI_PrintJob::DrawingArea() const
  151. {
  152. #if defined(__MS_WINDOWS__)
  153.     return UI_DrawingSurface::DrawingArea ();
  154. #elif defined(__OS2__)
  155.     return UI_Rectangle (0, 0, _drawingArea.cx, _drawingArea.cy);
  156. #endif
  157. }
  158.  
  159.  
  160.  
  161. UI_Rectangle UI_PrintJob::DrawingAreaInMM () const
  162. {
  163.     return UI_DrawingSurface::DrawingAreaInMM ();
  164. }
  165.  
  166.  
  167. bool UI_PrintJob::DrawBitmap (const UI_Bitmap& b, const UI_Point& p)
  168. {
  169. #if defined (__MS_WINDOWS__) || defined(__OS2__)
  170.     return UI_DrawingSurface::DrawBitmap (b, p);
  171. #endif
  172. }
  173.  
  174.  
  175. bool UI_PrintJob::SupportsColor () const
  176. {
  177. #if defined(__OS2__)
  178.     // Seems like if I use GpiSetColor on a printer context, then a black
  179.     // color is shown as white, and everything else is shown as black.
  180.     // (Happens on my PostScript printer.) So for now, PM  printing does not
  181.     // include color support.
  182.     return FALSE;
  183. #else
  184.     return TRUE;
  185. #endif
  186. }
  187.