Use native printing dialog for wxPrintDialog,

not for setup only as before. It prints,
    but page selection etc. is still an idea


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30591 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2004-11-17 16:59:50 +00:00
parent ecae80b250
commit 2934005d7d
4 changed files with 224 additions and 102 deletions

View File

@ -90,14 +90,23 @@ public:
};
//----------------------------------------------------------------------------
// wxGnomePrintSetupDialog
// wxGnomePrintDialog
//----------------------------------------------------------------------------
class wxGnomePrintSetupDialog: public wxDialog
class wxGnomePrintDialog: public wxPrintDialogBase
{
public:
wxGnomePrintSetupDialog( wxWindow *parent, wxPrintData *data );
~wxGnomePrintSetupDialog();
wxGnomePrintDialog( wxWindow *parent,
wxPrintDialogData* data = (wxPrintDialogData*)NULL );
wxGnomePrintDialog( wxWindow *parent, wxPrintData* data);
~wxGnomePrintDialog();
wxPrintData& GetPrintData()
{ return m_printDialogData.GetPrintData(); }
wxPrintDialogData& GetPrintDialogData()
{ return m_printDialogData; }
wxDC *GetPrintDC();
virtual int ShowModal();
@ -113,8 +122,12 @@ private:
int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {}
virtual void DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y),
int WXUNUSED(width), int WXUNUSED(height)) {}
void Init();
wxPrintDialogData m_printDialogData;
private:
DECLARE_DYNAMIC_CLASS(wxGnomePrintSetupDialog)
DECLARE_DYNAMIC_CLASS(wxGnomePrintDialog)
};
//----------------------------------------------------------------------------

View File

@ -90,14 +90,23 @@ public:
};
//----------------------------------------------------------------------------
// wxGnomePrintSetupDialog
// wxGnomePrintDialog
//----------------------------------------------------------------------------
class wxGnomePrintSetupDialog: public wxDialog
class wxGnomePrintDialog: public wxPrintDialogBase
{
public:
wxGnomePrintSetupDialog( wxWindow *parent, wxPrintData *data );
~wxGnomePrintSetupDialog();
wxGnomePrintDialog( wxWindow *parent,
wxPrintDialogData* data = (wxPrintDialogData*)NULL );
wxGnomePrintDialog( wxWindow *parent, wxPrintData* data);
~wxGnomePrintDialog();
wxPrintData& GetPrintData()
{ return m_printDialogData.GetPrintData(); }
wxPrintDialogData& GetPrintDialogData()
{ return m_printDialogData; }
wxDC *GetPrintDC();
virtual int ShowModal();
@ -113,8 +122,12 @@ private:
int WXUNUSED(sizeFlags) = wxSIZE_AUTO) {}
virtual void DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y),
int WXUNUSED(width), int WXUNUSED(height)) {}
void Init();
wxPrintDialogData m_printDialogData;
private:
DECLARE_DYNAMIC_CLASS(wxGnomePrintSetupDialog)
DECLARE_DYNAMIC_CLASS(wxGnomePrintDialog)
};
//----------------------------------------------------------------------------

View File

@ -88,23 +88,23 @@ wxPrintPreviewBase *wxGnomePrintFactory::CreatePrintPreview( wxPrintout *preview
wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent,
wxPrintDialogData *data )
{
return new wxGenericPrintDialog( parent, data );
return new wxGnomePrintDialog( parent, data );
}
wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent,
wxPrintData *data )
{
return new wxGenericPrintDialog( parent, data );
return new wxGnomePrintDialog( parent, data );
}
bool wxGnomePrintFactory::HasPrintSetupDialog()
{
return true;
return false;
}
wxDialog *wxGnomePrintFactory::CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data )
{
return new wxGnomePrintSetupDialog( parent, data );
return NULL;
}
bool wxGnomePrintFactory::HasOwnPrintToFile()
@ -119,19 +119,20 @@ bool wxGnomePrintFactory::HasPrinterLine()
wxString wxGnomePrintFactory::CreatePrinterLine()
{
// We should query "gnome_config_default" here
return _("GNOME print");
// redundant now
return wxEmptyString;
}
bool wxGnomePrintFactory::HasStatusLine()
{
// redundant now
return true;
}
wxString wxGnomePrintFactory::CreateStatusLine()
{
// We should query "gnome_config_default" here
return _("Ready");
// redundant now
return wxEmptyString;
}
wxPrintNativeDataBase *wxGnomePrintFactory::CreatePrintNativeData()
@ -143,23 +144,53 @@ wxPrintNativeDataBase *wxGnomePrintFactory::CreatePrintNativeData()
// wxGnomePrintSetupDialog
//----------------------------------------------------------------------------
IMPLEMENT_CLASS(wxGnomePrintSetupDialog, wxDialog)
IMPLEMENT_CLASS(wxGnomePrintDialog, wxPrintDialogBase)
wxGnomePrintSetupDialog::wxGnomePrintSetupDialog( wxWindow *parent, wxPrintData *data )
wxGnomePrintDialog::wxGnomePrintDialog( wxWindow *parent, wxPrintDialogData *data )
: wxPrintDialogBase(parent, wxID_ANY, _("Print"),
wxPoint(0, 0), wxSize(600, 600),
wxDEFAULT_DIALOG_STYLE |
wxTAB_TRAVERSAL)
{
wxGnomePrintNativeData *native =
(wxGnomePrintNativeData*) data->GetNativeData();
m_widget = gnome_print_dialog_new (native->GetPrintJob(), (guchar*)"Print setup", 0);
if (data)
m_printDialogData = *data;
Init();
}
wxGnomePrintSetupDialog::~wxGnomePrintSetupDialog()
wxGnomePrintDialog::wxGnomePrintDialog( wxWindow *parent, wxPrintData *data )
: wxPrintDialogBase(parent, wxID_ANY, _("Print"),
wxPoint(0, 0), wxSize(600, 600),
wxDEFAULT_DIALOG_STYLE |
wxTAB_TRAVERSAL)
{
if (data)
m_printDialogData = *data;
Init();
}
void wxGnomePrintDialog::Init()
{
wxPrintData data = m_printDialogData.GetPrintData();
wxGnomePrintNativeData *native =
(wxGnomePrintNativeData*) data.GetNativeData();
m_widget = gnome_print_dialog_new( native->GetPrintJob(),
(guchar*)"Print",
GNOME_PRINT_DIALOG_RANGE|GNOME_PRINT_DIALOG_COPIES );
}
wxGnomePrintDialog::~wxGnomePrintDialog()
{
m_widget = NULL;
}
int wxGnomePrintSetupDialog::ShowModal()
int wxGnomePrintDialog::ShowModal()
{
// Transfer data from m_printDalogData to dialog here
int response = gtk_dialog_run (GTK_DIALOG (m_widget));
gtk_widget_destroy(m_widget);
m_widget = NULL;
@ -167,25 +198,32 @@ int wxGnomePrintSetupDialog::ShowModal()
if (response == GNOME_PRINT_DIALOG_RESPONSE_CANCEL)
return wxID_CANCEL;
// Transfer data back here
return wxID_OK;
}
bool wxGnomePrintSetupDialog::Validate()
wxDC *wxGnomePrintDialog::GetPrintDC()
{
// Later
return NULL;
}
bool wxGnomePrintDialog::Validate()
{
return true;
}
bool wxGnomePrintSetupDialog::TransferDataToWindow()
bool wxGnomePrintDialog::TransferDataToWindow()
{
return true;
}
bool wxGnomePrintSetupDialog::TransferDataFromWindow()
bool wxGnomePrintDialog::TransferDataFromWindow()
{
return true;
}
//----------------------------------------------------------------------------
// wxGnomePrinter
//----------------------------------------------------------------------------
@ -215,7 +253,7 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
(wxGnomePrintNativeData*) printdata.GetNativeData();
// The GnomePrintJob is temporarily stored in the
// native print data as the native print setup dialog
// native print data as the native print dialog
// needs to access it.
GnomePrintJob *job = data->GetPrintJob();
m_gpc = gnome_print_job_get_context (job);
@ -287,7 +325,7 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
wxDC* wxGnomePrinter::PrintDialog( wxWindow *parent )
{
wxPrintDialog dialog( parent, &m_printDialogData );
wxGnomePrintDialog dialog( parent, &m_printDialogData );
if (dialog.ShowModal() == wxID_CANCEL)
{
sm_lastError = wxPRINTER_ERROR;
@ -449,18 +487,38 @@ void wxGnomePrintDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y,
{
if (!bitmap.Ok()) return;
#if 0
// TODO do something clever here
if (bitmap.HasPixbuf())
{
GdkPixbuf *pixbuf = bitmap.GetPixbuf();
guchar *raw_image = gdk_pixbuf_get_pixels( pixbuf );
bool has_alpha = gdk_pixbuf_get_has_alpha( pixbuf );
int rowstride = gdk_pixbuf_get_rowstride( pixbuf );
int height = gdk_pixbuf_get_height( pixbuf );
int width = gdk_pixbuf_get_width( pixbuf );
gnome_print_gsave( m_gpc );
double matrix[6];
matrix[0] = XLOG2DEVREL(width);
matrix[1] = 0;
matrix[2] = 0;
matrix[3] = YLOG2DEVREL(height);
matrix[4] = XLOG2DEV(x);
matrix[5] = YLOG2DEV(y+height);
gnome_print_concat( m_gpc, matrix );
gnome_print_moveto( m_gpc, 0, 0 );
if (has_alpha)
gnome_print_rgbaimage( m_gpc, (guchar *)raw_image, width, height, rowstride );
else
gnome_print_rgbimage( m_gpc, (guchar *)raw_image, width, height, rowstride );
gnome_print_grestore( m_gpc );
}
else
#endif
{
wxImage image = bitmap.ConvertToImage();
if (!image.Ok()) return;
gnome_print_gsave( m_gpc );
double matrix[6];
matrix[0] = XLOG2DEVREL(image.GetWidth());
matrix[1] = 0;
@ -471,31 +529,12 @@ void wxGnomePrintDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y,
gnome_print_concat( m_gpc, matrix );
gnome_print_moveto( m_gpc, 0, 0 );
gnome_print_rgbimage( m_gpc, (guchar*) image.GetData(), image.GetWidth(), image.GetHeight(), image.GetWidth()*3 );
gnome_print_grestore( m_gpc );
}
}
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);
@ -524,6 +563,15 @@ void wxGnomePrintDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y )
pango_attr_list_unref(attrs);
}
if (m_textForegroundColour.Ok())
{
unsigned char red = m_textForegroundColour.Red();
unsigned char blue = m_textForegroundColour.Blue();
unsigned char green = m_textForegroundColour.Green();
// Set the equivalent PangoAttrStyle
}
int w,h;
if (fabs(m_scaleY - 1.0) > 0.00001)

View File

@ -88,23 +88,23 @@ wxPrintPreviewBase *wxGnomePrintFactory::CreatePrintPreview( wxPrintout *preview
wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent,
wxPrintDialogData *data )
{
return new wxGenericPrintDialog( parent, data );
return new wxGnomePrintDialog( parent, data );
}
wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent,
wxPrintData *data )
{
return new wxGenericPrintDialog( parent, data );
return new wxGnomePrintDialog( parent, data );
}
bool wxGnomePrintFactory::HasPrintSetupDialog()
{
return true;
return false;
}
wxDialog *wxGnomePrintFactory::CreatePrintSetupDialog( wxWindow *parent, wxPrintData *data )
{
return new wxGnomePrintSetupDialog( parent, data );
return NULL;
}
bool wxGnomePrintFactory::HasOwnPrintToFile()
@ -119,19 +119,20 @@ bool wxGnomePrintFactory::HasPrinterLine()
wxString wxGnomePrintFactory::CreatePrinterLine()
{
// We should query "gnome_config_default" here
return _("GNOME print");
// redundant now
return wxEmptyString;
}
bool wxGnomePrintFactory::HasStatusLine()
{
// redundant now
return true;
}
wxString wxGnomePrintFactory::CreateStatusLine()
{
// We should query "gnome_config_default" here
return _("Ready");
// redundant now
return wxEmptyString;
}
wxPrintNativeDataBase *wxGnomePrintFactory::CreatePrintNativeData()
@ -143,23 +144,53 @@ wxPrintNativeDataBase *wxGnomePrintFactory::CreatePrintNativeData()
// wxGnomePrintSetupDialog
//----------------------------------------------------------------------------
IMPLEMENT_CLASS(wxGnomePrintSetupDialog, wxDialog)
IMPLEMENT_CLASS(wxGnomePrintDialog, wxPrintDialogBase)
wxGnomePrintSetupDialog::wxGnomePrintSetupDialog( wxWindow *parent, wxPrintData *data )
wxGnomePrintDialog::wxGnomePrintDialog( wxWindow *parent, wxPrintDialogData *data )
: wxPrintDialogBase(parent, wxID_ANY, _("Print"),
wxPoint(0, 0), wxSize(600, 600),
wxDEFAULT_DIALOG_STYLE |
wxTAB_TRAVERSAL)
{
wxGnomePrintNativeData *native =
(wxGnomePrintNativeData*) data->GetNativeData();
m_widget = gnome_print_dialog_new (native->GetPrintJob(), (guchar*)"Print setup", 0);
if (data)
m_printDialogData = *data;
Init();
}
wxGnomePrintSetupDialog::~wxGnomePrintSetupDialog()
wxGnomePrintDialog::wxGnomePrintDialog( wxWindow *parent, wxPrintData *data )
: wxPrintDialogBase(parent, wxID_ANY, _("Print"),
wxPoint(0, 0), wxSize(600, 600),
wxDEFAULT_DIALOG_STYLE |
wxTAB_TRAVERSAL)
{
if (data)
m_printDialogData = *data;
Init();
}
void wxGnomePrintDialog::Init()
{
wxPrintData data = m_printDialogData.GetPrintData();
wxGnomePrintNativeData *native =
(wxGnomePrintNativeData*) data.GetNativeData();
m_widget = gnome_print_dialog_new( native->GetPrintJob(),
(guchar*)"Print",
GNOME_PRINT_DIALOG_RANGE|GNOME_PRINT_DIALOG_COPIES );
}
wxGnomePrintDialog::~wxGnomePrintDialog()
{
m_widget = NULL;
}
int wxGnomePrintSetupDialog::ShowModal()
int wxGnomePrintDialog::ShowModal()
{
// Transfer data from m_printDalogData to dialog here
int response = gtk_dialog_run (GTK_DIALOG (m_widget));
gtk_widget_destroy(m_widget);
m_widget = NULL;
@ -167,25 +198,32 @@ int wxGnomePrintSetupDialog::ShowModal()
if (response == GNOME_PRINT_DIALOG_RESPONSE_CANCEL)
return wxID_CANCEL;
// Transfer data back here
return wxID_OK;
}
bool wxGnomePrintSetupDialog::Validate()
wxDC *wxGnomePrintDialog::GetPrintDC()
{
// Later
return NULL;
}
bool wxGnomePrintDialog::Validate()
{
return true;
}
bool wxGnomePrintSetupDialog::TransferDataToWindow()
bool wxGnomePrintDialog::TransferDataToWindow()
{
return true;
}
bool wxGnomePrintSetupDialog::TransferDataFromWindow()
bool wxGnomePrintDialog::TransferDataFromWindow()
{
return true;
}
//----------------------------------------------------------------------------
// wxGnomePrinter
//----------------------------------------------------------------------------
@ -215,7 +253,7 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
(wxGnomePrintNativeData*) printdata.GetNativeData();
// The GnomePrintJob is temporarily stored in the
// native print data as the native print setup dialog
// native print data as the native print dialog
// needs to access it.
GnomePrintJob *job = data->GetPrintJob();
m_gpc = gnome_print_job_get_context (job);
@ -287,7 +325,7 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
wxDC* wxGnomePrinter::PrintDialog( wxWindow *parent )
{
wxPrintDialog dialog( parent, &m_printDialogData );
wxGnomePrintDialog dialog( parent, &m_printDialogData );
if (dialog.ShowModal() == wxID_CANCEL)
{
sm_lastError = wxPRINTER_ERROR;
@ -449,18 +487,38 @@ void wxGnomePrintDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y,
{
if (!bitmap.Ok()) return;
#if 0
// TODO do something clever here
if (bitmap.HasPixbuf())
{
GdkPixbuf *pixbuf = bitmap.GetPixbuf();
guchar *raw_image = gdk_pixbuf_get_pixels( pixbuf );
bool has_alpha = gdk_pixbuf_get_has_alpha( pixbuf );
int rowstride = gdk_pixbuf_get_rowstride( pixbuf );
int height = gdk_pixbuf_get_height( pixbuf );
int width = gdk_pixbuf_get_width( pixbuf );
gnome_print_gsave( m_gpc );
double matrix[6];
matrix[0] = XLOG2DEVREL(width);
matrix[1] = 0;
matrix[2] = 0;
matrix[3] = YLOG2DEVREL(height);
matrix[4] = XLOG2DEV(x);
matrix[5] = YLOG2DEV(y+height);
gnome_print_concat( m_gpc, matrix );
gnome_print_moveto( m_gpc, 0, 0 );
if (has_alpha)
gnome_print_rgbaimage( m_gpc, (guchar *)raw_image, width, height, rowstride );
else
gnome_print_rgbimage( m_gpc, (guchar *)raw_image, width, height, rowstride );
gnome_print_grestore( m_gpc );
}
else
#endif
{
wxImage image = bitmap.ConvertToImage();
if (!image.Ok()) return;
gnome_print_gsave( m_gpc );
double matrix[6];
matrix[0] = XLOG2DEVREL(image.GetWidth());
matrix[1] = 0;
@ -471,31 +529,12 @@ void wxGnomePrintDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y,
gnome_print_concat( m_gpc, matrix );
gnome_print_moveto( m_gpc, 0, 0 );
gnome_print_rgbimage( m_gpc, (guchar*) image.GetData(), image.GetWidth(), image.GetHeight(), image.GetWidth()*3 );
gnome_print_grestore( m_gpc );
}
}
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);
@ -524,6 +563,15 @@ void wxGnomePrintDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y )
pango_attr_list_unref(attrs);
}
if (m_textForegroundColour.Ok())
{
unsigned char red = m_textForegroundColour.Red();
unsigned char blue = m_textForegroundColour.Blue();
unsigned char green = m_textForegroundColour.Green();
// Set the equivalent PangoAttrStyle
}
int w,h;
if (fabs(m_scaleY - 1.0) > 0.00001)