Added initial support for GNOME printing.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30116 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2004-10-27 11:19:30 +00:00
parent 9f1316dc97
commit ff910433fc
4 changed files with 1928 additions and 0 deletions

659
src/gtk/gnome/gprint.cpp Normal file
View File

@@ -0,0 +1,659 @@
/////////////////////////////////////////////////////////////////////////////
// Name: gnomeprint.cpp
// Author: XX
// Created: XX/XX/XX
// Copyright: XX
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "gprint.cpp"
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "gprint.h"
#include "wx/fontutil.h"
#include "wx/printdlg.h"
#include "wx/gtk/private.h"
#include <libgnomeprint/gnome-print.h>
#include <libgnomeprint/gnome-print-pango.h>
#include <libgnomeprintui/gnome-print-dialog.h>
//----------------------------------------------------------------------------
// wxGnomePrintNativeData
//----------------------------------------------------------------------------
IMPLEMENT_CLASS(wxGnomePrintNativeData, wxPrintNativeDataBase)
wxGnomePrintNativeData::wxGnomePrintNativeData()
{
m_config = gnome_print_config_default();
m_job = gnome_print_job_new( m_config );
}
wxGnomePrintNativeData::~wxGnomePrintNativeData()
{
g_object_unref (G_OBJECT (m_config));
g_object_unref (G_OBJECT (m_job));
}
bool wxGnomePrintNativeData::TransferTo( wxPrintData &data )
{
// TODO
return true;
}
bool wxGnomePrintNativeData::TransferFrom( const wxPrintData &data )
{
// TODO
return true;
}
//----------------------------------------------------------------------------
// wxGnomePrintFactory
//----------------------------------------------------------------------------
wxPrinterBase* wxGnomePrintFactory::CreatePrinter( wxPrintDialogData *data )
{
return new wxGnomePrinter( data );
}
wxPrintPreviewBase *wxGnomePrintFactory::CreatePrintPreview( wxPrintout *preview,
wxPrintout *printout,
wxPrintDialogData *data )
{
return new wxPostScriptPrintPreview( preview, printout, data );
}
wxPrintPreviewBase *wxGnomePrintFactory::CreatePrintPreview( wxPrintout *preview,
wxPrintout *printout,
wxPrintData *data )
{
return new wxPostScriptPrintPreview( preview, printout, data );
}
wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent,
wxPrintDialogData *data )
{
return new wxGenericPrintDialog( parent, data );
}
wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent,
wxPrintData *data )
{
return new wxGenericPrintDialog( parent, data );
}
bool wxGnomePrintFactory::HasPrintSetupDialog()
{
return true;
}
wxDialog *wxGnomePrintFactory::CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data )
{
return new wxGnomePrintSetupDialog( parent, data );
}
bool wxGnomePrintFactory::HasOwnPrintToFile()
{
return true;
}
bool wxGnomePrintFactory::HasPrinterLine()
{
return true;
}
wxString wxGnomePrintFactory::CreatePrinterLine()
{
// We should query "gnome_config_default" here
return _("GNOME print");
}
bool wxGnomePrintFactory::HasStatusLine()
{
return true;
}
wxString wxGnomePrintFactory::CreateStatusLine()
{
// We should query "gnome_config_default" here
return _("Ready");
}
wxPrintNativeDataBase *wxGnomePrintFactory::CreatePrintNativeData()
{
return new wxGnomePrintNativeData;
}
//----------------------------------------------------------------------------
// wxGnomePrintSetupDialog
//----------------------------------------------------------------------------
IMPLEMENT_CLASS(wxGnomePrintSetupDialog, wxDialog)
wxGnomePrintSetupDialog::wxGnomePrintSetupDialog( wxWindow *parent, wxPrintData *data )
{
wxGnomePrintNativeData *native =
(wxGnomePrintNativeData*) data->GetNativeData();
m_widget = gnome_print_dialog_new (native->GetPrintJob(), (guchar*)"Print setup", 0);
}
wxGnomePrintSetupDialog::~wxGnomePrintSetupDialog()
{
m_widget = NULL;
}
int wxGnomePrintSetupDialog::ShowModal()
{
int response = gtk_dialog_run (GTK_DIALOG (m_widget));
gtk_widget_destroy(m_widget);
m_widget = NULL;
if (response == GNOME_PRINT_DIALOG_RESPONSE_CANCEL)
return wxID_CANCEL;
return wxID_OK;
}
bool wxGnomePrintSetupDialog::Validate()
{
return true;
}
bool wxGnomePrintSetupDialog::TransferDataToWindow()
{
return true;
}
bool wxGnomePrintSetupDialog::TransferDataFromWindow()
{
return true;
}
//----------------------------------------------------------------------------
// wxGnomePrinter
//----------------------------------------------------------------------------
IMPLEMENT_CLASS(wxGnomePrinter, wxPrinterBase)
wxGnomePrinter::wxGnomePrinter( wxPrintDialogData *data ) :
wxPrinterBase( data )
{
m_gpc = NULL;
}
wxGnomePrinter::~wxGnomePrinter()
{
}
bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
{
if (!printout)
{
sm_lastError = wxPRINTER_ERROR;
return false;
}
wxPrintData printdata = GetPrintDialogData().GetPrintData();
wxGnomePrintNativeData *data =
(wxGnomePrintNativeData*) printdata.GetNativeData();
GnomePrintJob *job = data->GetPrintJob();
m_gpc = gnome_print_job_get_context (job);
wxDC *dc;
if (prompt)
dc = PrintDialog( parent );
else
dc = new wxGnomePrintDC( this );
if (!dc)
{
gnome_print_job_close( job );
return false;
}
printout->SetDC(dc);
printout->OnPreparePrinting();
printout->OnBeginPrinting();
if (!printout->OnBeginDocument(0, 0))
{
sm_lastError = wxPRINTER_ERROR;
}
else
{
int pn;
for (pn = 1; pn <= 2; pn++)
{
dc->StartPage();
printout->OnPrintPage(pn);
dc->EndPage();
}
printout->OnEndDocument();
printout->OnEndPrinting();
}
gnome_print_job_close( job );
gnome_print_job_print( job );
delete dc;
return (sm_lastError == wxPRINTER_NO_ERROR);
}
wxDC* wxGnomePrinter::PrintDialog( wxWindow *parent )
{
wxPrintDialog dialog( parent, &m_printDialogData );
if (dialog.ShowModal() == wxID_CANCEL)
{
sm_lastError = wxPRINTER_ERROR;
return NULL;
}
return new wxGnomePrintDC( this );
}
bool wxGnomePrinter::Setup( wxWindow *parent )
{
}
//-----------------------------------------------------------------------------
// wxGnomePrintDC
//-----------------------------------------------------------------------------
IMPLEMENT_CLASS(wxGnomePrintDC, wxDCBase)
wxGnomePrintDC::wxGnomePrintDC( wxGnomePrinter *printer )
{
m_printer = printer;
m_gpc = printer->GetPrintContext();
m_layout = gnome_print_pango_create_layout( m_gpc );
m_fontdesc = pango_font_description_from_string( "Sans 12" );
m_currentRed = 0;
m_currentBlue = 0;
m_currentGreen = 0;
m_signX = 1; // default x-axis left to right
m_signY = -1; // default y-axis bottom up -> top down
}
wxGnomePrintDC::~wxGnomePrintDC()
{
}
bool wxGnomePrintDC::Ok() const
{
return true;
}
bool wxGnomePrintDC::DoFloodFill(wxCoord x1, wxCoord y1, const wxColour &col, int style )
{
return false;
}
bool wxGnomePrintDC::DoGetPixel(wxCoord x1, wxCoord y1, wxColour *col) const
{
return false;
}
void wxGnomePrintDC::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
{
if (m_pen.GetStyle() == wxTRANSPARENT) return;
SetPen( m_pen );
gnome_print_moveto ( m_gpc, XDEV2LOG(x1), YDEV2LOG(y1) );
gnome_print_lineto ( m_gpc, XDEV2LOG(x2), YDEV2LOG(y2) );
gnome_print_stroke ( m_gpc);
CalcBoundingBox( x1, y1 );
CalcBoundingBox( x2, y2 );
}
void wxGnomePrintDC::DoCrossHair(wxCoord x, wxCoord y)
{
}
void wxGnomePrintDC::DoDrawArc(wxCoord x1,wxCoord y1,wxCoord x2,wxCoord y2,wxCoord xc,wxCoord yc)
{
}
void wxGnomePrintDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea)
{
}
void wxGnomePrintDC::DoDrawPoint(wxCoord x, wxCoord y)
{
}
void wxGnomePrintDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset)
{
}
void wxGnomePrintDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle)
{
}
void wxGnomePrintDC::DoDrawPolyPolygon(int n, int count[], wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle)
{
}
void wxGnomePrintDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
if (m_brush.GetStyle () != wxTRANSPARENT)
{
SetBrush( m_brush );
gnome_print_newpath( m_gpc );
gnome_print_moveto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) );
gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y) );
gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y + height) );
gnome_print_lineto( m_gpc, XLOG2DEV(x), YLOG2DEV(y + height) );
gnome_print_closepath( m_gpc );
gnome_print_fill( m_gpc );
CalcBoundingBox( x, y );
CalcBoundingBox( x + width, y + height );
}
if (m_pen.GetStyle () != wxTRANSPARENT)
{
SetPen (m_pen);
gnome_print_newpath( m_gpc );
gnome_print_moveto( m_gpc, XLOG2DEV(x), YLOG2DEV(y) );
gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y) );
gnome_print_lineto( m_gpc, XLOG2DEV(x + width), YLOG2DEV(y + height) );
gnome_print_lineto( m_gpc, XLOG2DEV(x), YLOG2DEV(y + height) );
gnome_print_closepath( m_gpc );
gnome_print_stroke( m_gpc );
CalcBoundingBox( x, y );
CalcBoundingBox( x + width, y + height );
}
}
void wxGnomePrintDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius)
{
}
void wxGnomePrintDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
}
void wxGnomePrintDC::DoDrawSpline(wxList *points)
{
}
bool wxGnomePrintDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
wxDC *source, wxCoord xsrc, wxCoord ysrc, int rop, bool useMask,
wxCoord xsrcMask, wxCoord ysrcMask)
{
return false;
}
void wxGnomePrintDC::DoDrawIcon( const wxIcon& icon, wxCoord x, wxCoord y )
{
}
void wxGnomePrintDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, bool useMask )
{
}
void wxGnomePrintDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y )
{
if (m_textForegroundColour.Ok())
{
unsigned char red = m_textForegroundColour.Red();
unsigned char blue = m_textForegroundColour.Blue();
unsigned char green = m_textForegroundColour.Green();
if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
{
double redPS = (double)(red) / 255.0;
double bluePS = (double)(blue) / 255.0;
double greenPS = (double)(green) / 255.0;
gnome_print_setrgbcolor( m_gpc, redPS, bluePS, greenPS );
m_currentRed = red;
m_currentBlue = blue;
m_currentGreen = green;
}
}
x = XLOG2DEV(x);
y = YLOG2DEV(y);
wxPrintf( wxT("x,y: %d,%d\n"), x, y );
bool underlined = m_font.Ok() && m_font.GetUnderlined();
#if wxUSE_UNICODE
const wxCharBuffer data = wxConvUTF8.cWC2MB( text );
#else
const wxWCharBuffer wdata = wxConvLocal.cMB2WC( text );
if ( !wdata )
return;
const wxCharBuffer data = wxConvUTF8.cWC2MB( wdata );
#endif
size_t datalen = strlen((const char*)data);
pango_layout_set_text( m_layout, (const char*) data, datalen);
if (underlined)
{
PangoAttrList *attrs = pango_attr_list_new();
PangoAttribute *a = pango_attr_underline_new(PANGO_UNDERLINE_SINGLE);
a->start_index = 0;
a->end_index = datalen;
pango_attr_list_insert(attrs, a);
pango_layout_set_attributes(m_layout, attrs);
pango_attr_list_unref(attrs);
}
gnome_print_moveto (m_gpc, x, y);
gnome_print_pango_layout( m_gpc, m_layout );
if (underlined)
{
// undo underline attributes setting:
pango_layout_set_attributes(m_layout, NULL);
}
// CalcBoundingBox (x + width, y + height);
CalcBoundingBox (x, y);
}
void wxGnomePrintDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle)
{
}
void wxGnomePrintDC::Clear()
{
}
void wxGnomePrintDC::SetFont( const wxFont& font )
{
m_font = font;
if (m_font.Ok())
{
if (m_fontdesc)
pango_font_description_free( m_fontdesc );
m_fontdesc = pango_font_description_copy( m_font.GetNativeFontInfo()->description );
pango_layout_set_font_description( m_layout, m_fontdesc );
}
}
void wxGnomePrintDC::SetPen( const wxPen& pen )
{
if (!pen.Ok()) return;
int oldStyle = m_pen.GetStyle();
m_pen = pen;
gnome_print_setlinewidth( m_gpc, XLOG2DEVREL( 1000 * m_pen.GetWidth() ) / 1000.0f );
unsigned char red = m_pen.GetColour().Red();
unsigned char blue = m_pen.GetColour().Blue();
unsigned char green = m_pen.GetColour().Green();
if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
{
double redPS = (double)(red) / 255.0;
double bluePS = (double)(blue) / 255.0;
double greenPS = (double)(green) / 255.0;
gnome_print_setrgbcolor( m_gpc, redPS, bluePS, greenPS );
m_currentRed = red;
m_currentBlue = blue;
m_currentGreen = green;
}
}
void wxGnomePrintDC::SetBrush( const wxBrush& brush )
{
}
void wxGnomePrintDC::SetLogicalFunction( int function )
{
}
void wxGnomePrintDC::SetBackground( const wxBrush& brush )
{
}
void wxGnomePrintDC::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
}
void wxGnomePrintDC::DestroyClippingRegion()
{
}
bool wxGnomePrintDC::StartDoc(const wxString& message)
{
SetDeviceOrigin( 0,0 );
return true;
}
void wxGnomePrintDC::EndDoc()
{
}
void wxGnomePrintDC::StartPage()
{
gnome_print_beginpage( m_gpc, (const guchar*) "1" );
}
void wxGnomePrintDC::EndPage()
{
gnome_print_showpage( m_gpc );
}
wxCoord wxGnomePrintDC::GetCharHeight() const
{
return 0;
}
wxCoord wxGnomePrintDC::GetCharWidth() const
{
return 0;
}
void wxGnomePrintDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y,
wxCoord *descent,
wxCoord *externalLeading,
wxFont *theFont ) const
{
}
void wxGnomePrintDC::DoGetSize(int* width, int* height) const
{
// No idea if that is efficient
GnomePrintConfig *config = gnome_print_config_default();
double w,h;
bool result = gnome_print_config_get_page_size( config, &w, &h );
if (!result)
{
// Standard PS resolution DIN A4 size.
w = 595.0;
h = 842.0;
}
if (width)
*width = (int) w;
if (height)
*height = (int) h;
wxPrintf( wxT("size %d,%d\n"), *width, *height );
}
void wxGnomePrintDC::DoGetSizeMM(int *width, int *height) const
{
double w,h;
/// Later, for now DIN A4
w = 210.0;
h = 297.0;
if (width)
*width = (int) w;
if (height)
*height = (int) h;
}
wxSize wxGnomePrintDC::GetPPI() const
{
return wxSize(72,72);
}
void wxGnomePrintDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
{
m_signX = (xLeftRight ? 1 : -1);
m_signY = (yBottomUp ? 1 : -1);
ComputeScaleAndOrigin();
}
void wxGnomePrintDC::SetDeviceOrigin( wxCoord x, wxCoord y )
{
int h = 0;
int w = 0;
GetSize( &w, &h );
wxDC::SetDeviceOrigin( x, h-y );
}
void wxGnomePrintDC::SetResolution(int ppi)
{
}
int wxGnomePrintDC::GetResolution()
{
return 72;
}