]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/gnome/gprint.cpp
Reverted changes that set m_widget to NULL in native
[wxWidgets.git] / src / gtk / gnome / gprint.cpp
index 2f35e4398735d24736014b3ee21ccca98bbe7cd6..4421ce7185aea8a2a504a88f18d41377b23d03b6 100644 (file)
 #include "wx/fontutil.h"
 #include "wx/printdlg.h"
 #include "wx/gtk/private.h"
+#include "wx/module.h"
+#include "wx/generic/prntdlgg.h"
 
 #include <libgnomeprint/gnome-print.h>
 #include <libgnomeprint/gnome-print-pango.h>
+#include <libgnomeprint/gnome-print-config.h>
 #include <libgnomeprintui/gnome-print-dialog.h>
 #include <libgnomeprintui/gnome-print-job-preview.h>
+#include <libgnomeprintui/gnome-print-paper-selector.h>
 
 //----------------------------------------------------------------------------
 // wxGnomePrintNativeData
@@ -48,7 +52,6 @@ wxGnomePrintNativeData::wxGnomePrintNativeData()
 wxGnomePrintNativeData::~wxGnomePrintNativeData()
 {
     g_object_unref (G_OBJECT (m_config));
-    g_object_unref (G_OBJECT (m_job));
 }
 
 bool wxGnomePrintNativeData::TransferTo( wxPrintData &data )
@@ -98,6 +101,19 @@ wxPrintDialogBase *wxGnomePrintFactory::CreatePrintDialog( wxWindow *parent,
     return new wxGnomePrintDialog( parent, data );
 }
                                                   
+wxPageSetupDialogBase *wxGnomePrintFactory::CreatePageSetupDialog( wxWindow *parent,
+                                                          wxPageSetupDialogData * data )
+{ 
+//  The native page setup dialog is broken. It
+//  miscalculates newly entered values for the
+//  margins if you have not chose "points" but
+//  e.g. centimerters. 
+//  This has been fixed in GNOME CVS (maybe
+//  fixed in libgnomeprintui 2.8.1)
+
+    return new wxGnomePageSetupDialog( parent, data );
+}
+                                                  
 bool wxGnomePrintFactory::HasPrintSetupDialog()
 {
     return false;
@@ -270,6 +286,141 @@ bool wxGnomePrintDialog::TransferDataFromWindow()
     return true;
 }
 
+//----------------------------------------------------------------------------
+// wxGnomePageSetupDialog
+//----------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(wxGnomePageSetupDialog, wxPageSetupDialogBase)
+
+wxGnomePageSetupDialog::wxGnomePageSetupDialog( wxWindow *parent,
+                            wxPageSetupDialogData* data )
+{
+    if (data)
+        m_pageDialogData = *data;
+        
+    wxGnomePrintNativeData *native =
+      (wxGnomePrintNativeData*) m_pageDialogData.GetPrintData().GetNativeData();
+
+    // This is required as the page setup dialog
+    // calculates wrong values otherwise.
+    gnome_print_config_set( native->GetPrintConfig(),
+                            (const guchar*) GNOME_PRINT_KEY_PREFERED_UNIT,
+                            (const guchar*) "Pts" );
+        
+    m_widget = gtk_dialog_new();
+    
+    gtk_window_set_title( GTK_WINDOW(m_widget), wxGTK_CONV( _("Page setup") ) );
+
+    GtkWidget *main = gnome_paper_selector_new_with_flags( native->GetPrintConfig(), 
+        GNOME_PAPER_SELECTOR_MARGINS|GNOME_PAPER_SELECTOR_FEED_ORIENTATION );
+    gtk_container_set_border_width (GTK_CONTAINER (main), 8);
+    gtk_widget_show (main);
+    
+    gtk_container_add( GTK_CONTAINER (GTK_DIALOG (m_widget)->vbox), main );
+    
+       gtk_dialog_set_has_separator (GTK_DIALOG (m_widget), TRUE);
+
+       gtk_dialog_add_buttons (GTK_DIALOG (m_widget),
+                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                               GTK_STOCK_OK, GTK_RESPONSE_OK,
+                               NULL);
+
+       gtk_dialog_set_default_response (GTK_DIALOG (m_widget),
+                                        GTK_RESPONSE_OK);
+}
+
+wxGnomePageSetupDialog::~wxGnomePageSetupDialog()
+{
+}
+
+wxPageSetupDialogData& wxGnomePageSetupDialog::GetPageSetupDialogData()
+{
+    return m_pageDialogData;
+}
+
+int wxGnomePageSetupDialog::ShowModal()
+{
+    wxGnomePrintNativeData *native =
+      (wxGnomePrintNativeData*) m_pageDialogData.GetPrintData().GetNativeData();
+    GnomePrintConfig *config = native->GetPrintConfig();
+      
+    // Transfer data from m_pageDialogData to native dialog
+
+    int ret = gtk_dialog_run( GTK_DIALOG(m_widget) );
+
+    if (ret == GTK_RESPONSE_OK)
+    {
+        // Transfer data back to m_pageDialogData
+
+        // I don't know how querying the last parameter works
+        // I cannot test it as the dialog is currently broken
+        // anyways (it only works for points).        
+        double ml,mr,mt,mb,pw,ph;
+           gnome_print_config_get_length (config,
+                               (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_LEFT, &ml, NULL);
+           gnome_print_config_get_length (config,
+                               (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT, &mr, NULL);
+           gnome_print_config_get_length (config,
+                               (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_TOP, &mt, NULL);
+           gnome_print_config_get_length (config,
+                               (const guchar*) GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM, &mb, NULL);
+       gnome_print_config_get_length (config,
+                           (const guchar*) GNOME_PRINT_KEY_PAPER_WIDTH, &pw, NULL);
+           gnome_print_config_get_length (config,
+                           (const guchar*) GNOME_PRINT_KEY_PAPER_HEIGHT, &ph, NULL);
+
+        // This probably assumes that the user entered the 
+        // values in Pts. Since that is the only the dialog
+        // works right now, we need to fix this later.
+        const GnomePrintUnit *mm_unit = gnome_print_unit_get_by_abbreviation( (const guchar*) "mm" );
+        const GnomePrintUnit *pts_unit = gnome_print_unit_get_by_abbreviation( (const guchar*) "Pts" );
+        gnome_print_convert_distance( &ml, pts_unit, mm_unit );
+        gnome_print_convert_distance( &mr, pts_unit, mm_unit );
+        gnome_print_convert_distance( &mt, pts_unit, mm_unit );
+        gnome_print_convert_distance( &mb, pts_unit, mm_unit );
+        gnome_print_convert_distance( &pw, pts_unit, mm_unit );
+        gnome_print_convert_distance( &ph, pts_unit, mm_unit );
+
+        m_pageDialogData.SetMarginTopLeft( wxPoint( (int)(ml+0.5), (int)(mt+0.5)) );
+        m_pageDialogData.SetMarginBottomRight( wxPoint( (int)(mr+0.5), (int)(mb+0.5)) );
+        
+        m_pageDialogData.SetPaperSize( wxSize( (int)(pw+0.5), (int)(ph+0.5) ) );
+
+#if 0
+        wxPrintf( wxT("paper %d %d, top margin %d\n"), 
+            m_pageDialogData.GetPaperSize().x,
+            m_pageDialogData.GetPaperSize().y,
+            m_pageDialogData.GetMarginTopLeft().x );
+#endif
+                
+        ret = wxID_OK;
+    }
+    else
+    {
+        ret = wxID_CANCEL;
+    }
+    
+    gtk_widget_destroy( m_widget );
+    m_widget = NULL;
+
+    return ret;
+}
+
+bool wxGnomePageSetupDialog::Validate()
+{
+    return true;
+}
+
+bool wxGnomePageSetupDialog::TransferDataToWindow()
+{
+    return true;
+}
+
+bool wxGnomePageSetupDialog::TransferDataFromWindow()
+{
+    return true;
+}
+
 //----------------------------------------------------------------------------
 // wxGnomePrinter
 //----------------------------------------------------------------------------
@@ -296,14 +447,17 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
     }
 
     wxPrintData printdata = GetPrintDialogData().GetPrintData();
-    wxGnomePrintNativeData *data = 
+    wxGnomePrintNativeData *native = 
         (wxGnomePrintNativeData*) printdata.GetNativeData();
 
+    GnomePrintJob *job = gnome_print_job_new( native->GetPrintConfig() );
+    m_gpc = gnome_print_job_get_context (job);
+
     // The GnomePrintJob is temporarily stored in the 
     // native print data as the native print dialog
     // needs to access it.
-    GnomePrintJob *job = data->GetPrintJob();
-    m_gpc = gnome_print_job_get_context (job);
+    native->SetPrintJob( job );
+
 
     printout->SetIsPreview(false);
 
@@ -324,6 +478,7 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
     if (!dc)
     {
         gnome_print_job_close( job );
+        g_object_unref (G_OBJECT (job));
         sm_lastError = wxPRINTER_ERROR;
         return false;
     }
@@ -353,6 +508,8 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
 
     if (maxPage == 0)
     {
+        gnome_print_job_close( job );
+        g_object_unref (G_OBJECT (job));
         sm_lastError = wxPRINTER_ERROR;
         return false;
     }
@@ -405,6 +562,7 @@ bool wxGnomePrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt )
         gnome_print_job_print( job );
     }
     
+    g_object_unref (G_OBJECT (job));
     delete dc;
     
     return (sm_lastError == wxPRINTER_NO_ERROR);
@@ -479,10 +637,10 @@ void wxGnomePrintDC::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
     
     SetPen( m_pen );
 
-       gnome_print_moveto ( m_gpc, XLOG2DEV(x1), YLOG2DEV(y1) );
-       gnome_print_lineto ( m_gpc, XLOG2DEV(x2), YLOG2DEV(y2) );
-       gnome_print_stroke ( m_gpc);
-       
+    gnome_print_moveto ( m_gpc, XLOG2DEV(x1), YLOG2DEV(y1) );
+    gnome_print_lineto ( m_gpc, XLOG2DEV(x2), YLOG2DEV(y2) );
+    gnome_print_stroke ( m_gpc);
+
     CalcBoundingBox( x1, y1 );
     CalcBoundingBox( x2, y2 );
 }
@@ -505,6 +663,22 @@ void wxGnomePrintDC::DoDrawPoint(wxCoord x, wxCoord y)
 
 void wxGnomePrintDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset)
 {
+    if (m_pen.GetStyle() == wxTRANSPARENT) return;
+
+    if (n <= 0) return;
+
+    SetPen (m_pen);
+
+    int i;
+    for ( i =0; i<n ; i++ )
+        CalcBoundingBox( XLOG2DEV(points[i].x+xoffset), YLOG2DEV(points[i].y+yoffset));
+
+    gnome_print_moveto ( m_gpc, XLOG2DEV(points[0].x+xoffset), YLOG2DEV(points[0].y+yoffset) );
+    
+    for (i = 1; i < n; i++)
+        gnome_print_lineto ( m_gpc, XLOG2DEV(points[i].x+xoffset), YLOG2DEV(points[i].y+yoffset) );
+
+    gnome_print_stroke ( m_gpc);
 }
 
 void wxGnomePrintDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle)
@@ -556,6 +730,57 @@ void wxGnomePrintDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width,
 
 void wxGnomePrintDC::DoDrawEllipse(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+height/2) );
+                           
+        // start with top half
+        gnome_print_curveto( m_gpc, 
+                            XLOG2DEV(x), YLOG2DEV(y),
+                            XLOG2DEV(x+width), YLOG2DEV(y),
+                            XLOG2DEV(x+width), YLOG2DEV(y+height/2) );
+        // lower half        
+        gnome_print_curveto( m_gpc, 
+                            XLOG2DEV(x+width), YLOG2DEV(y+height),
+                            XLOG2DEV(x), YLOG2DEV(y+height),
+                            XLOG2DEV(x), YLOG2DEV(y+height/2) );
+                            
+        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+height/2) );
+                           
+        // start with top half
+        gnome_print_curveto( m_gpc, 
+                            XLOG2DEV(x), YLOG2DEV(y),
+                            XLOG2DEV(x+width), YLOG2DEV(y),
+                            XLOG2DEV(x+width), YLOG2DEV(y+height/2) );
+        // lower half        
+        gnome_print_curveto( m_gpc, 
+                            XLOG2DEV(x+width), YLOG2DEV(y+height),
+                            XLOG2DEV(x), YLOG2DEV(y+height),
+                            XLOG2DEV(x), YLOG2DEV(y+height/2) );
+                            
+        gnome_print_closepath( m_gpc );
+        gnome_print_stroke( m_gpc );
+        
+        CalcBoundingBox( x, y );
+        CalcBoundingBox( x + width, y + height );
+    }
 }
 
 void wxGnomePrintDC::DoDrawSpline(wxList *points)
@@ -671,7 +896,7 @@ void wxGnomePrintDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord
             double bluePS = (double)(blue) / 255.0;
             double greenPS = (double)(green) / 255.0;
 
-            gnome_print_setrgbcolor( m_gpc, redPS, bluePS, greenPS );
+            gnome_print_setrgbcolor( m_gpc, redPS, greenPS, bluePS );
 
             m_currentRed = red;
             m_currentBlue = blue;
@@ -788,6 +1013,24 @@ void wxGnomePrintDC::SetPen( const wxPen& pen )
 
     gnome_print_setlinewidth( m_gpc, XLOG2DEVREL( 1000 * m_pen.GetWidth() ) / 1000.0f );
 
+
+    static const double dotted[] =  {2.0, 5.0};
+    static const double short_dashed[] = {4.0, 4.0};
+    static const double wxCoord_dashed[] = {4.0, 8.0};
+    static const double dotted_dashed[] = {6.0, 6.0, 2.0, 6.0};
+
+    switch (m_pen.GetStyle())
+    {
+        case wxDOT:           gnome_print_setdash( m_gpc, 2, dotted, 0 ); break;
+        case wxSHORT_DASH:    gnome_print_setdash( m_gpc, 2, short_dashed, 0 ); break;
+        case wxLONG_DASH:     gnome_print_setdash( m_gpc, 2, wxCoord_dashed, 0 ); break;
+        case wxDOT_DASH:      gnome_print_setdash( m_gpc, 4, dotted_dashed, 0 );  break;
+        case wxSOLID:
+        case wxTRANSPARENT:
+        default:              gnome_print_setdash( m_gpc, 0, NULL, 0 );   break;
+    }
+
+    
     unsigned char red = m_pen.GetColour().Red();
     unsigned char blue = m_pen.GetColour().Blue();
     unsigned char green = m_pen.GetColour().Green();
@@ -798,7 +1041,7 @@ void wxGnomePrintDC::SetPen( const wxPen& pen )
         double bluePS = (double)(blue) / 255.0;
         double greenPS = (double)(green) / 255.0;
 
-        gnome_print_setrgbcolor( m_gpc, redPS, bluePS, greenPS );
+        gnome_print_setrgbcolor( m_gpc, redPS, greenPS, bluePS );
 
         m_currentRed = red;
         m_currentBlue = blue;
@@ -837,7 +1080,7 @@ void wxGnomePrintDC::SetBrush( const wxBrush& brush )
         double bluePS = (double)(blue) / 255.0;
         double greenPS = (double)(green) / 255.0;
 
-        gnome_print_setrgbcolor( m_gpc, redPS, bluePS, greenPS );
+        gnome_print_setrgbcolor( m_gpc, redPS, greenPS, bluePS );
 
         m_currentRed = red;
         m_currentBlue = blue;
@@ -870,6 +1113,7 @@ bool wxGnomePrintDC::StartDoc(const wxString& message)
 
 void wxGnomePrintDC::EndDoc()
 {
+    gnome_print_end_doc( m_gpc );
 }
 
 void wxGnomePrintDC::StartPage()
@@ -971,37 +1215,41 @@ void wxGnomePrintDC::DoGetTextExtent(const wxString& string, wxCoord *width, wxC
 
 void wxGnomePrintDC::DoGetSize(int* width, int* height) const
 {
-    // No idea if that is efficient
-    GnomePrintConfig *config = gnome_print_config_default();
+    wxGnomePrintNativeData *native =
+      (wxGnomePrintNativeData*) m_printData.GetNativeData();
+
+    // Query page size. This seems to omit the margins
+    // right now, although it shouldn't
+    double pw,ph;
+    gnome_print_job_get_page_size( native->GetPrintJob(), &pw, &ph );
 
-    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;
+        *width = (int) (pw + 0.5);
     if (height)
-        *height = (int) h;
+        *height = (int) (ph + 0.5);
 }
 
 void wxGnomePrintDC::DoGetSizeMM(int *width, int *height) const
 {
-    double w,h;
+    wxGnomePrintNativeData *native =
+      (wxGnomePrintNativeData*) m_printData.GetNativeData();
+
+    // This code assumes values in Pts. 
+    
+    double pw,ph;
+    gnome_print_job_get_page_size( native->GetPrintJob(), &pw, &ph );
+
+    // Convert to mm.
     
-    /// Later, for now DIN A4
-    w = 210.0;
-    h = 297.0;
+    const GnomePrintUnit *mm_unit = gnome_print_unit_get_by_abbreviation( (const guchar*) "mm" );
+    const GnomePrintUnit *pts_unit = gnome_print_unit_get_by_abbreviation( (const guchar*) "Pts" );
+    gnome_print_convert_distance( &pw, pts_unit, mm_unit );
+    gnome_print_convert_distance( &ph, pts_unit, mm_unit );
     
     if (width)
-        *width = (int) w;
+        *width = (int) (pw + 0.5);
     if (height)
-        *height = (int) h;
+        *height = (int) (ph + 0.5);
 }
 
 wxSize wxGnomePrintDC::GetPPI() const
@@ -1048,6 +1296,6 @@ private:
 };
 
 IMPLEMENT_DYNAMIC_CLASS(wxGnomePrintModule, wxModule)
-   
+  
 #endif
     // wxUSE_LIBGNOMEPRINT