Enrico Tröger wrote:
>> You will find the code attached, these are the issues:
>>     
> I don't ;-(.
>
>   

Let's try inline then:



/* February 2008, Bastiaan Veelo, [EMAIL PROTECTED] */

#include <gtk/gtk.h>
#include <cairo.h>
#ifdef CAIRO_HAS_PDF_SURFACE
#include <cairo-pdf.h>
#endif

static GtkWidget *window = NULL;
static GtkPrintSettings *settings = NULL;
static GtkPageSetup *page_setup = NULL;
static gdouble scale100 = -1;
static GtkWidget *font_button = NULL;

static void
begin_print (GtkPrintOperation *operation, GtkPrintContext *context, 
gpointer user_data)
{
  gtk_print_operation_set_n_pages (operation, 1);
}


/* We draw in mm, with (0,0) being the top left corner of the text area. */
static void
draw_page (cairo_t *cr)
{
  g_return_if_fail (page_setup != NULL);

  cairo_set_source_rgb (cr, 0, 0, 0);
  cairo_rectangle (cr,
                   0,
                   0,
                   100,
                   100);
  cairo_set_line_width (cr, .2);
  cairo_stroke (cr);

  /* Draw some lines */
  cairo_move_to (cr, 0, 0);
  cairo_line_to (cr,
                 gtk_page_setup_get_page_width (page_setup, GTK_UNIT_MM),
                 gtk_page_setup_get_page_height (page_setup, GTK_UNIT_MM));
  cairo_move_to (cr, 0, gtk_page_setup_get_page_height (page_setup, 
GTK_UNIT_MM));
  cairo_line_to (cr, gtk_page_setup_get_page_width (page_setup, 
GTK_UNIT_MM), 0);

  cairo_set_line_width (cr, 1);
  cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
  cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);

  cairo_stroke (cr);

  PangoFontDescription *desc =
      pango_font_description_from_string (gtk_font_button_get_font_name 
(GTK_FONT_BUTTON (font_button)));

  const gdouble dpi = 27.2;     /* ???? Misterious empirical value. */
  PangoLayout *pango_cairo_layout = pango_cairo_create_layout (cr);
  pango_layout_set_font_description (pango_cairo_layout, desc);
  pango_cairo_context_set_resolution (pango_layout_get_context 
(pango_cairo_layout), dpi);
  cairo_font_options_t *options = cairo_font_options_create ();
  cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF);
  cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE);
  pango_cairo_context_set_font_options (pango_layout_get_context 
(pango_cairo_layout), options);
  cairo_font_options_destroy (options);
  pango_layout_set_text (pango_cairo_layout,
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog "
                         "the quick brown fox jumped over the lazy dog", 
-1);
  pango_layout_set_width (pango_cairo_layout, 100*PANGO_SCALE);
  cairo_move_to (cr, 0, 0);
  pango_cairo_show_layout (cr, pango_cairo_layout);
  g_object_unref (pango_cairo_layout);
  pango_font_description_free (desc);

  cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
                          CAIRO_FONT_WEIGHT_NORMAL);
  cairo_set_font_size (cr, 12.0);       /* size em in mm */
  cairo_move_to(cr, 0., 120.);
  cairo_show_text(cr, "m Hello World! Printing...");
  cairo_move_to(cr, 0., 120.);
  cairo_line_to(cr, 12., 120.);
  cairo_set_line_width (cr, .2);
  cairo_stroke (cr);

  cairo_show_page (cr);
}

static void
print_page (GtkPrintOperation *operation, GtkPrintContext *context,
            gint page_nr, gpointer user_data)
{
  g_debug("Print dpi = %f, scale = %f.", gtk_print_context_get_dpi_y 
(context), gtk_print_context_get_dpi_y (context)/25.4);
  cairo_t *cr = gtk_print_context_get_cairo_context (context);

  cairo_scale (cr,
               gtk_print_context_get_dpi_x (context)/25.4,
               gtk_print_context_get_dpi_y (context)/25.4);
  draw_page (cr);
}


void YGTK_page_setup()
{
  if (settings == NULL)
    settings = gtk_print_settings_new ();

  GtkPageSetup *new_page_setup =
      gtk_print_run_page_setup_dialog (GTK_WINDOW (window), page_setup, 
settings);

  if (page_setup)
    g_object_unref (page_setup);

  page_setup = new_page_setup;
  gtk_widget_queue_draw (window);
}


void YGTK_print_dialog()
{
  GtkPrintOperation *print;
  GtkPrintOperationResult result;
  GError *error;

  print = gtk_print_operation_new ();

  if (settings != NULL)
    gtk_print_operation_set_print_settings (print, settings);
  g_return_if_fail (page_setup != NULL);
  gtk_print_operation_set_default_page_setup (print, page_setup);

  g_signal_connect (print, "begin-print", G_CALLBACK (begin_print), NULL);
  g_signal_connect (print, "draw-page", G_CALLBACK (print_page), NULL);

  result = gtk_print_operation_run (print, 
GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
                                    GTK_WINDOW (window), &error);

  if (result == GTK_PRINT_OPERATION_RESULT_ERROR)
  {
    GtkWidget *error_dialog = gtk_message_dialog_new (GTK_WINDOW (window),
                                                      
GTK_DIALOG_DESTROY_WITH_PARENT,
                                                      GTK_MESSAGE_ERROR,
                                                      GTK_BUTTONS_CLOSE,
                                                      "Error printing 
file:\n%s",
                                                      error->message);
    g_signal_connect (error_dialog, "response",
                      G_CALLBACK (gtk_widget_destroy), NULL);
    gtk_widget_show (error_dialog);
    g_error_free (error);
  }
  else if (result == GTK_PRINT_OPERATION_RESULT_APPLY)
  {
    if (settings != NULL)
      g_object_unref (settings);
    settings = g_object_ref (gtk_print_operation_get_print_settings 
(print));
  }

  g_object_unref (print);
}


static gboolean
on_expose_event(GtkWidget      *widget,
                GdkEventExpose *event,
                gpointer        data)
{
  cairo_t *cr;

  cr = gdk_cairo_create(GTK_LAYOUT(widget)->bin_window);

  g_return_val_if_fail (page_setup != NULL, FALSE);

  cairo_translate (cr,
                   gtk_page_setup_get_left_margin (page_setup, 
GTK_UNIT_MM) * scale100,
                   gtk_page_setup_get_top_margin (page_setup, 
GTK_UNIT_MM) * scale100);
     /* See also cairo_surface_set_device_offset() */

  cairo_scale (cr, scale100, scale100);

  draw_page (cr);

  cairo_destroy(cr);

  return FALSE;
}


#ifdef CAIRO_HAS_PDF_SURFACE
static void
export_to_PDF (GtkButton *button, gpointer data)
{
  GtkWidget *dialog =
      gtk_file_chooser_dialog_new ("Export PDF File",
                                    GTK_WINDOW (window),
                                    GTK_FILE_CHOOSER_ACTION_SAVE,
                                    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                    GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
                                    NULL);
  gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER 
(dialog), TRUE);

  gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), 
"printout.pdf");
  GtkFileFilter *pdf_filter = gtk_file_filter_new();
  gtk_file_filter_set_name( pdf_filter, "Portable Document Format Files" );
  gtk_file_filter_add_pattern( pdf_filter, "*.pdf" );
  gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( dialog ), pdf_filter );
  GtkFileFilter *all_files_filter = gtk_file_filter_new();
  gtk_file_filter_set_name( all_files_filter, "All Files" );
  gtk_file_filter_add_pattern( all_files_filter, "*" );
  gtk_file_chooser_add_filter( GTK_FILE_CHOOSER( dialog ), 
all_files_filter );


  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
  {
    gchar *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER 
(dialog));
    if (!g_str_has_suffix (filename, ".pdf"))
    {
      gchar *result = g_strconcat (filename, ".pdf", NULL);
      g_free (filename);
      filename = result;
    }

    g_return_if_fail (page_setup != NULL);
    cairo_surface_t *surface =
        cairo_pdf_surface_create (filename,
                                  gtk_page_setup_get_paper_width 
(page_setup,
                                                                  
GTK_UNIT_POINTS),
                                  gtk_page_setup_get_paper_height 
(page_setup,
                                                                  
GTK_UNIT_POINTS));
    cairo_t *cr = cairo_create (surface);
    g_debug("PDF dpi = %f (points per inch), scale = %f.", 72., 72./25.4);

    cairo_translate (cr,
                     gtk_page_setup_get_left_margin (page_setup, 
GTK_UNIT_MM) * 72 / 25.4,
                     gtk_page_setup_get_top_margin (page_setup, 
GTK_UNIT_MM) * 72 / 25.4);
       /* See also cairo_surface_set_device_offset() */

    cairo_scale (cr, 72/25.4, 72/25.4);

    draw_page (cr);

    cairo_surface_destroy (surface);
    cairo_destroy(cr);
    g_free (filename);
  }

  gtk_widget_destroy (dialog);
}
#endif /* CAIRO_HAS_PDF_SURFACE */

int main (int argc, char *argv[])
{
  gtk_init (&argc, &argv);

  page_setup = gtk_page_setup_new();
  GtkPaperSize *A4 = gtk_paper_size_new (GTK_PAPER_NAME_A4);
  gtk_page_setup_set_paper_size_and_default_margins (page_setup, A4);
  gtk_page_setup_set_top_margin (page_setup, 25., GTK_UNIT_MM);
  gtk_page_setup_set_bottom_margin (page_setup, 25., GTK_UNIT_MM);
  gtk_page_setup_set_left_margin (page_setup, 25., GTK_UNIT_MM);
  gtk_page_setup_set_right_margin (page_setup, 25., GTK_UNIT_MM);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  g_signal_connect (window, "destroy",
                    G_CALLBACK (gtk_main_quit), NULL);

  GtkWidget *vbox = gtk_vbox_new (FALSE, 5);
  gtk_container_add (GTK_CONTAINER (window), vbox);
  GtkWidget *hbox = gtk_hbox_new (FALSE, 5);
  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);

  GtkWidget *page_button = gtk_button_new_with_mnemonic ("Page _Setup");
  gtk_box_pack_start (GTK_BOX (hbox), page_button, FALSE, FALSE, 0);
  g_signal_connect (page_button, "clicked",
                    G_CALLBACK (YGTK_page_setup), NULL);

  GtkWidget *print_button = gtk_button_new_from_stock (GTK_STOCK_PRINT);
  gtk_box_pack_start (GTK_BOX (hbox), print_button, FALSE, FALSE, 0);
  g_signal_connect (print_button, "clicked",
                    G_CALLBACK (YGTK_print_dialog), NULL);

  GtkWidget *pdf_button = gtk_button_new_with_mnemonic ("_Export to PDF");
  gtk_box_pack_start (GTK_BOX (hbox), pdf_button, FALSE, FALSE, 0);
#ifdef CAIRO_HAS_PDF_SURFACE
  g_signal_connect (pdf_button, "clicked",
                    G_CALLBACK (export_to_PDF), NULL);
#else
  gtk_widget_set_sensitive (pdf_button, FALSE);
#endif
 
  font_button = gtk_font_button_new_with_font("Sans 12");
  gtk_box_pack_start (GTK_BOX (hbox), font_button, FALSE, FALSE, 0);

  GtkWidget *scrolled = gtk_scrolled_window_new(NULL, NULL);
  gtk_box_pack_start_defaults (GTK_BOX (vbox), scrolled);
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
                                  GTK_POLICY_AUTOMATIC, 
GTK_POLICY_AUTOMATIC);

  GtkWidget *drawing = gtk_layout_new 
(gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled)),
                                       
gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled)));
  gtk_container_add (GTK_CONTAINER (scrolled), drawing);
  GdkColor white;
  gdk_color_parse ("#FFF", &white);
  gtk_widget_modify_bg (drawing, GTK_STATE_NORMAL, &white);

  scale100 = gdk_screen_get_resolution (gdk_screen_get_default()) / 25.4;
  if (scale100 < 0) scale100 = 96. / 25.4;    /* Fall back to default. */
  g_debug("Screen dpi = %f, scale = %f.", scale100*25.4, scale100);

  gtk_layout_set_size (GTK_LAYOUT (drawing),
                       scale100 * gtk_page_setup_get_paper_width 
(page_setup, GTK_UNIT_MM),
                       scale100 * gtk_page_setup_get_paper_height 
(page_setup, GTK_UNIT_MM));

  g_signal_connect(drawing, "expose-event",
                   G_CALLBACK (on_expose_event), NULL);
  g_signal_connect_swapped (font_button, "font-set",
                            G_CALLBACK(gtk_widget_queue_draw), drawing);
  GtkRequisition scrollbar_size;
  gtk_widget_size_request (gtk_scrolled_window_get_vscrollbar 
(GTK_SCROLLED_WINDOW (scrolled)),
                           &scrollbar_size);
  gtk_window_set_default_size (GTK_WINDOW (window),
                               scale100 * gtk_page_setup_get_paper_width 
(page_setup, GTK_UNIT_MM) +
                                   scrollbar_size.width + 5,
                               gdk_screen_get_height 
(gdk_screen_get_default()));

  gtk_widget_show_all (window);

  gtk_main();

  gtk_paper_size_free (A4);
  return 0;
}

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to