8 #include "display-gtk.h"
10 /* Why doesn't pango/gtk have these quoting functions? */
11 static inline int add_char(char *buffer, size_t size, int len, char c)
18 /* Add an escape string "atomically" - all or nothing */
19 static int add_str(char *buffer, size_t size, int len, const char *s)
23 while ((c = *s++) != 0) {
31 static int add_quoted_string(char *buffer, size_t size, int len, const char *s)
40 unsigned char c = *s++;
43 len = add_char(buffer, size, len, c);
58 len = add_str(buffer, size, len, escape);
67 * You know what? Maybe somebody can do a real Pango layout thing.
70 static void show_dive_text(struct dive *dive, cairo_t *cr, double w, double h, PangoFontDescription *font)
75 char buffer[1024], divenr[20];
77 layout = pango_cairo_create_layout(cr);
78 pango_layout_set_font_description(layout, font);
79 pango_layout_set_width(layout, w * PANGO_SCALE);
80 pango_layout_set_height(layout, h * PANGO_SCALE * 0.9);
81 pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
85 snprintf(divenr, sizeof(divenr), "Dive #%d - ", dive->number);
88 tm = gmtime(&dive->when);
89 len = snprintf(buffer, sizeof(buffer),
90 "<span size=\"large\">"
91 "%s%s, %s %d, %d %d:%02d"
95 monthname(tm->tm_mon),
96 tm->tm_mday, tm->tm_year + 1900,
97 tm->tm_hour, tm->tm_min);
100 * Leave an empty line even if no location: otherwise the notes can
101 * overrun the depth/duration information.
104 len = add_quoted_string(buffer, sizeof(buffer), len, dive->location);
106 len = add_char(buffer, sizeof(buffer), len, '\n');
109 len = add_char(buffer, sizeof(buffer), len, '\n');
110 len = add_quoted_string(buffer, sizeof(buffer), len, dive->notes);
113 pango_layout_set_justify(layout, 1);
114 pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
115 pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
116 pango_layout_set_markup(layout, buffer, len);
118 cairo_move_to(cr, 0, 0);
119 pango_cairo_show_layout(cr, layout);
122 * This is still problematic: a long dive location will clash
123 * with the depth/duration information. Need to mask that or
124 * create a box or something.
126 snprintf(buffer, sizeof(buffer),
127 "<span size=\"small\">"
131 to_feet(dive->maxdepth),
132 dive->duration.seconds / 60,
133 dive->duration.seconds % 60);
135 pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
136 pango_layout_set_markup(layout, buffer, -1);
138 cairo_move_to(cr, 0, 0);
139 pango_cairo_show_layout(cr, layout);
141 g_object_unref(layout);
144 static void show_dive_profile(struct dive *dive, cairo_t *cr, double w, double h)
146 struct graphics_context gc = {
151 plot(&gc, w, h, dive);
155 static void print(int divenr, cairo_t *cr, double x, double y, double w, double h, PangoFontDescription *font)
159 dive = get_dive(divenr);
163 cairo_translate(cr, x, y);
165 /* Plus 5% on all sides */
166 cairo_translate(cr, w/20, h/20);
169 /* We actually want to scale the text and the lines now */
170 cairo_scale(cr, 0.5, 0.5);
172 /* Dive plot in the upper two thirds - note the scaling */
173 show_dive_profile(dive, cr, w*2, h*1.33);
175 /* Dive information in the lower third */
176 cairo_translate(cr, 0, h*1.33);
178 show_dive_text(dive, cr, w*2, h*0.67, font);
183 static void draw_page(GtkPrintOperation *operation,
184 GtkPrintContext *context,
191 PangoFontDescription *font;
193 cr = gtk_print_context_get_cairo_context(context);
194 font = pango_font_description_from_string("Sans");
196 w = gtk_print_context_get_width(context)/2;
197 h = gtk_print_context_get_height(context)/3;
200 print(nr+0, cr, 0, 0, w, h, font);
201 print(nr+1, cr, w, 0, w, h, font);
202 print(nr+2, cr, 0, h, w, h, font);
203 print(nr+3, cr, w, h, w, h, font);
204 print(nr+4, cr, 0, 2*h, w, h, font);
205 print(nr+5, cr, w, 2*h, w, h, font);
207 pango_font_description_free(font);
210 static void begin_print(GtkPrintOperation *operation, gpointer user_data)
214 static GtkPrintSettings *settings = NULL;
219 GtkPrintOperation *print;
220 GtkPrintOperationResult res;
223 print = gtk_print_operation_new();
224 if (settings != NULL)
225 gtk_print_operation_set_print_settings(print, settings);
226 pages = (dive_table.nr + 5) / 6;
227 gtk_print_operation_set_n_pages(print, pages);
228 g_signal_connect(print, "begin_print", G_CALLBACK(begin_print), NULL);
229 g_signal_connect(print, "draw_page", G_CALLBACK(draw_page), NULL);
230 res = gtk_print_operation_run(print, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
231 GTK_WINDOW(main_window), NULL);
232 if (res == GTK_PRINT_OPERATION_RESULT_APPLY) {
233 if (settings != NULL)
234 g_object_unref(settings);
235 settings = g_object_ref(gtk_print_operation_get_print_settings(print));
237 g_object_unref(print);