]> git.saurik.com Git - wxWidgets.git/blame - src/gtk1/gnome/gprint.cpp
the position attribute is called 'pos', not 'position'
[wxWidgets.git] / src / gtk1 / gnome / gprint.cpp
CommitLineData
ff910433
RR
1/////////////////////////////////////////////////////////////////////////////
2// Name: gnomeprint.cpp
3// Author: XX
4// Created: XX/XX/XX
5// Copyright: XX
6/////////////////////////////////////////////////////////////////////////////
7
8#ifdef __GNUG__
9 #pragma implementation "gprint.cpp"
10#endif
11
12// For compilers that support precompilation, includes "wx/wx.h".
13#include "wx/wxprec.h"
14
15#ifdef __BORLANDC__
16 #pragma hdrstop
17#endif
18
19#include "gprint.h"
20#include "wx/fontutil.h"
21#include "wx/printdlg.h"
22#include "wx/gtk/private.h"
23
24#include <libgnomeprint/gnome-print.h>
25#include <libgnomeprint/gnome-print-pango.h>
26#include <libgnomeprintui/gnome-print-dialog.h>
27
28//----------------------------------------------------------------------------
29// wxGnomePrintNativeData
30//----------------------------------------------------------------------------
31
32IMPLEMENT_CLASS(wxGnomePrintNativeData, wxPrintNativeDataBase)
33
34wxGnomePrintNativeData::wxGnomePrintNativeData()
35{
36 m_config = gnome_print_config_default();
37 m_job = gnome_print_job_new( m_config );
38}
39
40wxGnomePrintNativeData::~wxGnomePrintNativeData()
41{
42 g_object_unref (G_OBJECT (m_config));
43 g_object_unref (G_OBJECT (m_job));
44}
45
46bool wxGnomePrintNativeData::TransferTo( wxPrintData &data )
47{
48 // TODO
49 return true;
50}
51
52bool wxGnomePrintNativeData::TransferFrom( const wxPrintData &data )
53{
54 // TODO
55 return true;
56}
57
58//----------------------------------------------------------------------------
59// wxGnomePrintFactory
60//----------------------------------------------------------------------------
61
62wxPrinterBase* wxGnomePrintFactory::CreatePrinter( wxPrintDialogData *data )
63{
64 return new wxGnomePrinter( data );
65}
66
67wxPrintPreviewBase *wxGnomePrintFactory::CreatePrintPreview( wxPrintout *preview,
68 wxPrintout *printout,
69 wxPrintDialogData *data )
70{
71 return new wxPostScriptPrintPreview( preview, printout, data );
72}
73
74wxPrintPreviewBase *wxGnomePrintFactory::CreatePrintPreview( wxPrintout *preview,
75 wxPrintout *printout,
76 wxPrintData *data )
77{
78 return new wxPostScriptPrintPreview( preview, printout, data );
79}
80
81wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent,
82 wxPrintDialogData *data )
83{
84 return new wxGenericPrintDialog( parent, data );
85}
86
87wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent,
88 wxPrintData *data )
89{
90 return new wxGenericPrintDialog( parent, data );
91}
92
93bool wxGnomePrintFactory::HasPrintSetupDialog()
94{
95 return true;
96}
97
98wxDialog *wxGnomePrintFactory::CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data )
99{
100 return new wxGnomePrintSetupDialog( parent, data );
101}
102
103bool wxGnomePrintFactory::HasOwnPrintToFile()
104{
105 return true;
106}
107
108bool wxGnomePrintFactory::HasPrinterLine()
109{
110 return true;
111}
112
113wxString wxGnomePrintFactory::CreatePrinterLine()
114{
115 // We should query "gnome_config_default" here
116 return _("GNOME print");
117}
118
119bool wxGnomePrintFactory::HasStatusLine()
120{
121 return true;
122}
123
124wxString wxGnomePrintFactory::CreateStatusLine()
125{
126 // We should query "gnome_config_default" here
127 return _("Ready");
128}
129
130wxPrintNativeDataBase *wxGnomePrintFactory::CreatePrintNativeData()
131{
132 return new wxGnomePrintNativeData;
133}
134
135//----------------------------------------------------------------------------
136// wxGnomePrintSetupDialog
137//----------------------------------------------------------------------------
138
139IMPLEMENT_CLASS(wxGnomePrintSetupDialog, wxDialog)
140
141wxGnomePrintSetupDialog::wxGnomePrintSetupDialog( wxWindow *parent, wxPrintData *data )
142{
143 wxGnomePrintNativeData *native =
144 (wxGnomePrintNativeData*) data->GetNativeData();
145
146 m_widget = gnome_print_dialog_new (native->GetPrintJob(), (guchar*)"Print setup", 0);
147}
148
149wxGnomePrintSetupDialog::~wxGnomePrintSetupDialog()
150{
151 m_widget = NULL;
152}
153
154int wxGnomePrintSetupDialog::ShowModal()
155{
156 int response = gtk_dialog_run (GTK_DIALOG (m_widget));
157 gtk_widget_destroy(m_widget);
158 m_widget = NULL;
159
160 if (response == GNOME_PRINT_DIALOG_RESPONSE_CANCEL)
161 return wxID_CANCEL;
162
163 return wxID_OK;
164}
165
166bool wxGnomePrintSetupDialog::Validate()
167{
168 return true;
169}
170
171bool wxGnomePrintSetupDialog::TransferDataToWindow()
172{
173 return true;
174}
175
176bool wxGnomePrintSetupDialog::TransferDataFromWindow()
177{
178 return true;
179}
180
181
182//----------------------------------------------------------------------------
183// wxGnomePrinter
184//----------------------------------------------------------------------------
185
186IMPLEMENT_CLASS(wxGnomePrinter, wxPrinterBase)
187
188wxGnomePrinter::wxGnomePrinter( wxPrintDialogData *data ) :
189 wxPrinterBase( data )
190{
191 m_gpc = NULL;
192}
193
194wxGnomePrinter::~wxGnomePrinter()
195{
196}
197
198bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
199{
200 if (!printout)
201 {
202 sm_lastError = wxPRINTER_ERROR;
203 return false;
204 }
205
206 wxPrintData printdata = GetPrintDialogData().GetPrintData();
207 wxGnomePrintNativeData *data =
208 (wxGnomePrintNativeData*) printdata.GetNativeData();
209
210 GnomePrintJob *job = data->GetPrintJob();
211 m_gpc = gnome_print_job_get_context (job);
212
213 wxDC *dc;
214
215 if (prompt)
216 dc = PrintDialog( parent );
217 else
218 dc = new wxGnomePrintDC( this );
219
220 if (!dc)
221 {
222 gnome_print_job_close( job );
223 return false;
224 }
225
226 printout->SetDC(dc);
227
228 printout->OnPreparePrinting();
229 printout->OnBeginPrinting();
230
231 if (!printout->OnBeginDocument(0, 0))
232 {
233 sm_lastError = wxPRINTER_ERROR;
234 }
235 else
236 {
237 int pn;
238 for (pn = 1; pn <= 2; pn++)
239 {
240 dc->StartPage();
241 printout->OnPrintPage(pn);
242 dc->EndPage();
243 }
244
245 printout->OnEndDocument();
246 printout->OnEndPrinting();
247 }
248
249 gnome_print_job_close( job );
250 gnome_print_job_print( job );
251
252 delete dc;
253
254 return (sm_lastError == wxPRINTER_NO_ERROR);
255}
256
257wxDC* wxGnomePrinter::PrintDialog( wxWindow *parent )
258{
259 wxPrintDialog dialog( parent, &m_printDialogData );
260 if (dialog.ShowModal() == wxID_CANCEL)
261 {
262 sm_lastError = wxPRINTER_ERROR;
263 return NULL;
264 }
265
266 return new wxGnomePrintDC( this );
267}
268
269bool wxGnomePrinter::Setup( wxWindow *parent )
270{
271}
272
273//-----------------------------------------------------------------------------
274// wxGnomePrintDC
275//-----------------------------------------------------------------------------
276
277IMPLEMENT_CLASS(wxGnomePrintDC, wxDCBase)
278
279wxGnomePrintDC::wxGnomePrintDC( wxGnomePrinter *printer )
280{
281 m_printer = printer;
282
283 m_gpc = printer->GetPrintContext();
284
285 m_layout = gnome_print_pango_create_layout( m_gpc );
286 m_fontdesc = pango_font_description_from_string( "Sans 12" );
287
288 m_currentRed = 0;
289 m_currentBlue = 0;
290 m_currentGreen = 0;
291
292 m_signX = 1; // default x-axis left to right
293 m_signY = -1; // default y-axis bottom up -> top down
294}
295
296wxGnomePrintDC::~wxGnomePrintDC()
297{
298}
299
300bool wxGnomePrintDC::Ok() const
301{
302 return true;
303}
304
305bool wxGnomePrintDC::DoFloodFill(wxCoord x1, wxCoord y1, const wxColour &col, int style )
306{
307 return false;
308}
309
310bool wxGnomePrintDC::DoGetPixel(wxCoord x1, wxCoord y1, wxColour *col) const
311{
312 return false;
313}
314
315void wxGnomePrintDC::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
316{
317 if (m_pen.GetStyle() == wxTRANSPARENT) return;
318
319 SetPen( m_pen );
320
321 gnome_print_moveto ( m_gpc, XDEV2LOG(x1), YDEV2LOG(y1) );
322 gnome_print_lineto ( m_gpc, XDEV2LOG(x2), YDEV2LOG(y2) );
323 gnome_print_stroke ( m_gpc);
324
325 CalcBoundingBox( x1, y1 );
326 CalcBoundingBox( x2, y2 );
327}
328
329void wxGnomePrintDC::DoCrossHair(wxCoord x, wxCoord y)
330{
331}
332
333void wxGnomePrintDC::DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc)
334{
335}
336
337void wxGnomePrintDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea)
338{
339}
340
341void wxGnomePrintDC::DoDrawPoint(wxCoord x, wxCoord y)
342{
343}
344
345void wxGnomePrintDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset)
346{
347}
348
349void wxGnomePrintDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle)
350{
351}
352
353void wxGnomePrintDC::DoDrawPolyPolygon(int n, int count[], wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle)
354{
355}
356
357void wxGnomePrintDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
358{
359 if (m_brush.GetStyle () != wxTRANSPARENT)
360 {
361 SetBrush( m_brush );
362
363 gnome_print_newpath( m_gpc );
364 gnome_print_moveto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) );
365 gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y) );
366 gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y + height) );
367 gnome_print_lineto( m_gpc, XLOG2DEV(x), YLOG2DEV(y + height) );
368 gnome_print_closepath( m_gpc );
369 gnome_print_fill( m_gpc );
370
371 CalcBoundingBox( x, y );
372 CalcBoundingBox( x + width, y + height );
373 }
374
375 if (m_pen.GetStyle () != wxTRANSPARENT)
376 {
377 SetPen (m_pen);
378
379 gnome_print_newpath( m_gpc );
380 gnome_print_moveto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) );
381 gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y) );
382 gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y + height) );
383 gnome_print_lineto( m_gpc, XLOG2DEV(x), YLOG2DEV(y + height) );
384 gnome_print_closepath( m_gpc );
385 gnome_print_stroke( m_gpc );
386
387 CalcBoundingBox( x, y );
388 CalcBoundingBox( x + width, y + height );
389 }
390}
391
392void wxGnomePrintDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius)
393{
394}
395
396void wxGnomePrintDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
397{
398}
399
400void wxGnomePrintDC::DoDrawSpline(wxList *points)
401{
402}
403
404bool wxGnomePrintDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
405 wxDC *source, wxCoord xsrc, wxCoord ysrc, int rop, bool useMask,
406 wxCoord xsrcMask, wxCoord ysrcMask)
407{
408 return false;
409}
410
411void wxGnomePrintDC::DoDrawIcon( const wxIcon& icon, wxCoord x, wxCoord y )
412{
413}
414
415void wxGnomePrintDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, bool useMask )
416{
417}
418
419void wxGnomePrintDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y )
420{
421 if (m_textForegroundColour.Ok())
422 {
423 unsigned char red = m_textForegroundColour.Red();
424 unsigned char blue = m_textForegroundColour.Blue();
425 unsigned char green = m_textForegroundColour.Green();
426
427 if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
428 {
429 double redPS = (double)(red) / 255.0;
430 double bluePS = (double)(blue) / 255.0;
431 double greenPS = (double)(green) / 255.0;
432
433 gnome_print_setrgbcolor( m_gpc, redPS, bluePS, greenPS );
434
435 m_currentRed = red;
436 m_currentBlue = blue;
437 m_currentGreen = green;
438 }
439 }
440
441 x = XLOG2DEV(x);
442 y = YLOG2DEV(y);
443
444 wxPrintf( wxT("x,y: %d,%d\n"), x, y );
445
446 bool underlined = m_font.Ok() && m_font.GetUnderlined();
447
448#if wxUSE_UNICODE
449 const wxCharBuffer data = wxConvUTF8.cWC2MB( text );
450#else
451 const wxWCharBuffer wdata = wxConvLocal.cMB2WC( text );
452 if ( !wdata )
453 return;
454 const wxCharBuffer data = wxConvUTF8.cWC2MB( wdata );
455#endif
456
457 size_t datalen = strlen((const char*)data);
458 pango_layout_set_text( m_layout, (const char*) data, datalen);
459
460 if (underlined)
461 {
462 PangoAttrList *attrs = pango_attr_list_new();
463 PangoAttribute *a = pango_attr_underline_new(PANGO_UNDERLINE_SINGLE);
464 a->start_index = 0;
465 a->end_index = datalen;
466 pango_attr_list_insert(attrs, a);
467 pango_layout_set_attributes(m_layout, attrs);
468 pango_attr_list_unref(attrs);
469 }
470
471 gnome_print_moveto (m_gpc, x, y);
472 gnome_print_pango_layout( m_gpc, m_layout );
473
474 if (underlined)
475 {
476 // undo underline attributes setting:
477 pango_layout_set_attributes(m_layout, NULL);
478 }
479
480// CalcBoundingBox (x + width, y + height);
481 CalcBoundingBox (x, y);
482}
483
484void wxGnomePrintDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle)
485{
486}
487
488void wxGnomePrintDC::Clear()
489{
490}
491
492void wxGnomePrintDC::SetFont( const wxFont& font )
493{
494 m_font = font;
495
496 if (m_font.Ok())
497 {
498 if (m_fontdesc)
499 pango_font_description_free( m_fontdesc );
500
501 m_fontdesc = pango_font_description_copy( m_font.GetNativeFontInfo()->description );
502
503 pango_layout_set_font_description( m_layout, m_fontdesc );
504 }
505}
506
507void wxGnomePrintDC::SetPen( const wxPen& pen )
508{
509 if (!pen.Ok()) return;
510
511 int oldStyle = m_pen.GetStyle();
512
513 m_pen = pen;
514
515 gnome_print_setlinewidth( m_gpc, XLOG2DEVREL( 1000 * m_pen.GetWidth() ) / 1000.0f );
516
517 unsigned char red = m_pen.GetColour().Red();
518 unsigned char blue = m_pen.GetColour().Blue();
519 unsigned char green = m_pen.GetColour().Green();
520
521 if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
522 {
523 double redPS = (double)(red) / 255.0;
524 double bluePS = (double)(blue) / 255.0;
525 double greenPS = (double)(green) / 255.0;
526
527 gnome_print_setrgbcolor( m_gpc, redPS, bluePS, greenPS );
528
529 m_currentRed = red;
530 m_currentBlue = blue;
531 m_currentGreen = green;
532 }
533}
534
535void wxGnomePrintDC::SetBrush( const wxBrush& brush )
536{
537}
538
539void wxGnomePrintDC::SetLogicalFunction( int function )
540{
541}
542
543void wxGnomePrintDC::SetBackground( const wxBrush& brush )
544{
545}
546
547void wxGnomePrintDC::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
548{
549}
550
551void wxGnomePrintDC::DestroyClippingRegion()
552{
553}
554
555bool wxGnomePrintDC::StartDoc(const wxString& message)
556{
557 SetDeviceOrigin( 0,0 );
558
559 return true;
560}
561
562void wxGnomePrintDC::EndDoc()
563{
564}
565
566void wxGnomePrintDC::StartPage()
567{
568 gnome_print_beginpage( m_gpc, (const guchar*) "1" );
569}
570
571void wxGnomePrintDC::EndPage()
572{
573 gnome_print_showpage( m_gpc );
574}
575
576wxCoord wxGnomePrintDC::GetCharHeight() const
577{
578 return 0;
579}
580
581wxCoord wxGnomePrintDC::GetCharWidth() const
582{
583 return 0;
584}
585
586void wxGnomePrintDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y,
587 wxCoord *descent,
588 wxCoord *externalLeading,
589 wxFont *theFont ) const
590{
591}
592
593void wxGnomePrintDC::DoGetSize(int* width, int* height) const
594{
595 // No idea if that is efficient
596 GnomePrintConfig *config = gnome_print_config_default();
597
598 double w,h;
599 bool result = gnome_print_config_get_page_size( config, &w, &h );
600
601 if (!result)
602 {
603 // Standard PS resolution DIN A4 size.
604 w = 595.0;
605 h = 842.0;
606 }
607
608 if (width)
609 *width = (int) w;
610 if (height)
611 *height = (int) h;
612
613 wxPrintf( wxT("size %d,%d\n"), *width, *height );
614}
615
616void wxGnomePrintDC::DoGetSizeMM(int *width, int *height) const
617{
618 double w,h;
619
620 /// Later, for now DIN A4
621 w = 210.0;
622 h = 297.0;
623
624 if (width)
625 *width = (int) w;
626 if (height)
627 *height = (int) h;
628}
629
630wxSize wxGnomePrintDC::GetPPI() const
631{
632 return wxSize(72,72);
633}
634
635void wxGnomePrintDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
636{
637 m_signX = (xLeftRight ? 1 : -1);
638 m_signY = (yBottomUp ? 1 : -1);
639
640 ComputeScaleAndOrigin();
641}
642
643void wxGnomePrintDC::SetDeviceOrigin( wxCoord x, wxCoord y )
644{
645 int h = 0;
646 int w = 0;
647 GetSize( &w, &h );
648
649 wxDC::SetDeviceOrigin( x, h-y );
650}
651
652void wxGnomePrintDC::SetResolution(int ppi)
653{
654}
655
656int wxGnomePrintDC::GetResolution()
657{
658 return 72;
659}