]> git.saurik.com Git - wxWidgets.git/blame - src/os2/dcprint.cpp
fix for assert when setting tooltip for a readonly combo
[wxWidgets.git] / src / os2 / dcprint.cpp
CommitLineData
27476f73
DW
1/////////////////////////////////////////////////////////////////////////////
2// Name: dcprint.cpp
3// Purpose: wxPrinterDC class
fb46a9a6 4// Author: David Webster
27476f73 5// Modified by:
fb46a9a6 6// Created: 10/14/99
27476f73 7// RCS-ID: $Id$
fb46a9a6
DW
8// Copyright: (c) David Webster
9// Licence: wxWindows licence
27476f73
DW
10/////////////////////////////////////////////////////////////////////////////
11
27476f73
DW
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
fb46a9a6
DW
14
15#define INCL_DEV
16#define INCL_GPI
17#define INCL_PM
18#include<os2.h>
19
27476f73
DW
20#ifndef WX_PRECOMP
21#endif
22
23#include "wx/string.h"
24#include "wx/log.h"
25#include "wx/window.h"
26#include "wx/os2/private.h"
27#include "wx/dcprint.h"
28#include "math.h"
29
27476f73 30IMPLEMENT_CLASS(wxPrinterDC, wxDC)
27476f73 31
27476f73
DW
32
33// This form is deprecated
34wxPrinterDC::wxPrinterDC(const wxString& driver_name, const wxString& device_name, const wxString& file, bool interactive, int orientation)
35{
9dea36ef
DW
36 LONG lType = 0;
37 HAB hab = 0;
27476f73
DW
38 DEVOPENSTRUC devOpen = { (char*)device_name.c_str()
39 ,(char*)driver_name.c_str()
40 ,NULL
41 ,NULL
42 ,NULL
43 ,NULL
44 ,NULL
45 ,NULL
46 ,NULL
47 };
48
49 m_isInteractive = interactive;
50
223d09f6 51 if (!file.IsNull() && file != wxT(""))
27476f73
DW
52 m_printData.SetFilename(file);
53
54/*
55 Implement PM's version of this
56#if wxUSE_COMMON_DIALOGS
57 if (interactive)
58 {
59 PRINTDLG pd;
60
61 pd.lStructSize = sizeof( PRINTDLG );
62 pd.hwndOwner=(HWND) NULL;
63 pd.hDevMode=(HANDLE)NULL;
64 pd.hDevNames=(HANDLE)NULL;
65 pd.Flags=PD_RETURNDC | PD_NOSELECTION | PD_NOPAGENUMS;
66 pd.nFromPage=0;
67 pd.nToPage=0;
68 pd.nMinPage=0;
69 pd.nMaxPage=0;
70 pd.nCopies=1;
71 pd.hInstance=(HINSTANCE)NULL;
72
73 if ( PrintDlg( &pd ) != 0 )
74 {
75 m_hDC = (WXHDC) pd.hDC;
76 m_ok = TRUE;
77 }
78 else
79 {
80 m_ok = FALSE;
81 return;
82 }
83
84 // m_dontDelete = TRUE;
85 }
86 else
87#endif
88*/
223d09f6
KB
89 if ((!driver_name.IsNull() && driver_name != wxT("")) &&
90 (!device_name.IsNull() && device_name != wxT("")) &&
91 (!file.IsNull() && file != wxT("")))
27476f73
DW
92 {
93 m_hDC = (WXHDC) ::DevOpenDC( hab
94 ,OD_QUEUED
95 ,"*"
96 ,5L
97 ,(PDEVOPENDATA)&devOpen
98 ,NULLHANDLE
99 );
100 m_ok = m_hDC ? TRUE: FALSE;
101 }
102 else
103 {
104 wxPrintData printData;
105 printData.SetOrientation(orientation);
106 m_hDC = wxGetPrinterDC(printData);
107 m_ok = m_hDC ? TRUE: FALSE;
108 }
109
110 if (m_hDC)
111 {
112 // int width = GetDeviceCaps(m_hDC, VERTRES);
113 // int height = GetDeviceCaps(m_hDC, HORZRES);
114 SetMapMode(wxMM_TEXT);
115 }
116 SetBrush(*wxBLACK_BRUSH);
117 SetPen(*wxBLACK_PEN);
118}
119
120wxPrinterDC::wxPrinterDC(const wxPrintData& printData)
121{
122 m_printData = printData;
123
124 m_isInteractive = FALSE;
125
126 m_hDC = wxGetPrinterDC(printData);
127 m_ok = (m_hDC != 0);
128
129 if (m_hDC)
130 SetMapMode(wxMM_TEXT);
131
132 SetBrush(*wxBLACK_BRUSH);
133 SetPen(*wxBLACK_PEN);
134}
135
136
137wxPrinterDC::wxPrinterDC(WXHDC theDC)
138{
139 m_isInteractive = FALSE;
140
141 m_hDC = theDC;
142 m_ok = TRUE;
143 if (m_hDC)
144 {
145 // int width = GetDeviceCaps(m_hDC, VERTRES);
146 // int height = GetDeviceCaps(m_hDC, HORZRES);
147 SetMapMode(wxMM_TEXT);
148 }
149 SetBrush(*wxBLACK_BRUSH);
150 SetPen(*wxBLACK_PEN);
151}
152
153wxPrinterDC::~wxPrinterDC(void)
154{
155}
156
157bool wxPrinterDC::StartDoc(const wxString& message)
158{
159/* TODO: PM's implementation
160 DOCINFO docinfo;
161 docinfo.cbSize = sizeof(DOCINFO);
162 docinfo.lpszDocName = (const wxChar*)message;
163
164 wxString filename(m_printData.GetFilename());
165
166 if (filename.IsEmpty())
167 docinfo.lpszOutput = NULL;
168 else
169 docinfo.lpszOutput = (const wxChar *) filename;
170
171#if defined(__WIN95__)
172 docinfo.lpszDatatype = NULL;
173 docinfo.fwType = 0;
174#endif
175
176 if (!m_hDC)
177 return FALSE;
178
179 int ret =
180#ifndef __WIN32__
181 ::StartDoc((HDC) m_hDC, &docinfo);
182#else
183#ifdef UNICODE
184 ::StartDocW((HDC) m_hDC, &docinfo);
185#else
186#ifdef __TWIN32__
187 ::StartDoc((HDC) m_hDC, &docinfo);
188#else
189 ::StartDocA((HDC) m_hDC, &docinfo);
190#endif
191#endif
192#endif
193
194#ifndef __WIN16__
195 if (ret <= 0)
196 {
197 DWORD lastError = GetLastError();
223d09f6 198 wxLogDebug(wxT("wxDC::StartDoc failed with error: %d\n"), lastError);
27476f73
DW
199 }
200#endif
201 return (ret > 0);
202*/
203 return(TRUE);
204}
205
206void wxPrinterDC::EndDoc(void)
207{
208// if (m_hDC) ::EndDoc((HDC) m_hDC);
209}
210
211void wxPrinterDC::StartPage(void)
212{
213// if (m_hDC)
214// ::StartPage((HDC) m_hDC);
215}
216
217void wxPrinterDC::EndPage(void)
218{
219// if (m_hDC)
220// ::EndPage((HDC) m_hDC);
221}
222
223// Returns default device and port names
224static bool wxGetDefaultDeviceName(wxString& deviceName, wxString& portName)
225{
226 deviceName = "";
227/*
228 LPDEVNAMES lpDevNames;
229 LPSTR lpszDriverName;
230 LPSTR lpszDeviceName;
231 LPSTR lpszPortName;
232
233 PRINTDLG pd;
234
235 // Cygwin has trouble believing PRINTDLG is 66 bytes - thinks it is 68
236#ifdef __GNUWIN32__
237 pd.lStructSize = 66; // sizeof(PRINTDLG);
238#else
239 pd.lStructSize = sizeof(PRINTDLG);
240#endif
241
242 pd.hwndOwner = (HWND)NULL;
243 pd.hDevMode = NULL; // Will be created by PrintDlg
244 pd.hDevNames = NULL; // Ditto
245 pd.Flags = PD_RETURNDEFAULT;
246 pd.nCopies = 1;
247
248 if (!PrintDlg((LPPRINTDLG)&pd))
249 {
250 if ( pd.hDevMode )
251 GlobalFree(pd.hDevMode);
252 if (pd.hDevNames)
253 GlobalFree(pd.hDevNames);
254
255 return FALSE;
256 }
257
258 if (pd.hDevNames)
259 {
260 lpDevNames = (LPDEVNAMES)GlobalLock(pd.hDevNames);
261 lpszDriverName = (LPSTR)lpDevNames + lpDevNames->wDriverOffset;
262 lpszDeviceName = (LPSTR)lpDevNames + lpDevNames->wDeviceOffset;
263 lpszPortName = (LPSTR)lpDevNames + lpDevNames->wOutputOffset;
264 GlobalUnlock(pd.hDevNames);
265 GlobalFree(pd.hDevNames);
266 pd.hDevNames=NULL;
267
268 deviceName = lpszDeviceName;
269 portName = lpszPortName;
270 }
271
272 if (pd.hDevMode)
273 {
274 GlobalFree(pd.hDevMode);
275 pd.hDevMode=NULL;
276 }
223d09f6 277 return ( deviceName != wxT("") );
27476f73
DW
278*/
279 return(TRUE);
280}
281
282// Gets an HDC for the specified printer configuration
283WXHDC WXDLLEXPORT wxGetPrinterDC(const wxPrintData& printDataConst)
284{
9dea36ef 285 HDC hDC = NULLHANDLE;
27476f73
DW
286/*
287 wxPrintData printData = printDataConst;
288 printData.ConvertToNative();
289
290 wxChar* driverName = (wxChar*) NULL;
291
292 wxString devNameStr = printData.GetPrinterName();
293 wxChar* deviceName;
294 wxChar* portName = (wxChar*) NULL; // Obsolete in WIN32
295
223d09f6 296 if (devNameStr == wxT(""))
27476f73
DW
297 deviceName = (wxChar*) NULL;
298 else
299 deviceName = WXSTRINGCAST devNameStr;
300
301 LPDEVMODE lpDevMode = (LPDEVMODE) NULL;
302
303 HGLOBAL hDevMode = (HGLOBAL)(DWORD) printData.GetNativeData();
304
305 if ( hDevMode )
306 lpDevMode = (DEVMODE*) GlobalLock(hDevMode);
307
223d09f6 308 if (devNameStr == wxT(""))
27476f73
DW
309 {
310 // Retrieve the default device name
311 wxString portName;
312 bool ret = wxGetDefaultDeviceName(devNameStr, portName);
313
223d09f6 314 wxASSERT_MSG( ret, wxT("Could not get default device name.") );
27476f73
DW
315
316 deviceName = WXSTRINGCAST devNameStr;
317 }
318
319#ifdef __WIN32__
320 HDC hDC = CreateDC(driverName, deviceName, portName, (DEVMODE *) lpDevMode);
321#else
322 HDC hDC = CreateDC(driverName, deviceName, portName, (LPSTR) lpDevMode);
323#endif
324
325 if (hDevMode && lpDevMode)
326 GlobalUnlock(hDevMode);
327*/
328 return (WXHDC) hDC;
329}
330