[gnumeric] Make remaining shett object widgets printable by ssconvert



commit ce0f5c89036b70188aa9f7a9e0c8fd003d5576ef
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date:   Wed Aug 7 22:15:07 2013 -0600

    Make remaining shett object widgets printable by ssconvert
    
    2013-08-07  Andreas J. Guelzow <aguelzow pyrshep ca>
    
        * src/sheet-object-widget.c (draw_cairo_text): add arguments and
        change all callers
        (sheet_widget_frame_draw_cairo): new
        (sheet_widget_button_draw_cairo): new
        (sheet_widget_scrollbar_horizontal_draw_cairo): new
        (sheet_widget_scrollbar_vertical_draw_cairo): new
        (sheet_widget_scrollbar_class_init): connect the above
        (sheet_widget_spinbutton_draw_cairo): new
        (sheet_widget_spinbutton_class_init): connect the above
        (sheet_widget_slider_horizontal_draw_cairo): new
        (sheet_widget_slider_vertical_draw_cairo): new
        (sheet_widget_slider_draw_cairo): new
        (sheet_widget_slider_class_init): connect the above
        (sheet_widget_list_draw_cairo): new
        (sheet_widget_list_class_init): connect the above
        (sheet_widget_combo_draw_cairo): new
        (sheet_widget_combo_class_init): connect the above

 ChangeLog                 |   20 ++
 src/sheet-object-widget.c |  548 ++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 532 insertions(+), 36 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index a48a3ca..163f662 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,25 @@
 2013-08-07  Andreas J. Guelzow <aguelzow pyrshep ca>
 
+       * src/sheet-object-widget.c (draw_cairo_text): add arguments and
+       change all callers
+       (sheet_widget_frame_draw_cairo): new
+       (sheet_widget_button_draw_cairo): new
+       (sheet_widget_scrollbar_horizontal_draw_cairo): new
+       (sheet_widget_scrollbar_vertical_draw_cairo): new
+       (sheet_widget_scrollbar_class_init): connect the above
+       (sheet_widget_spinbutton_draw_cairo): new
+       (sheet_widget_spinbutton_class_init): connect the above
+       (sheet_widget_slider_horizontal_draw_cairo): new
+       (sheet_widget_slider_vertical_draw_cairo): new
+       (sheet_widget_slider_draw_cairo): new
+       (sheet_widget_slider_class_init): connect the above
+       (sheet_widget_list_draw_cairo): new
+       (sheet_widget_list_class_init): connect the above
+       (sheet_widget_combo_draw_cairo): new
+       (sheet_widget_combo_class_init): connect the above
+
+2013-08-07  Andreas J. Guelzow <aguelzow pyrshep ca>
+
        * src/sheet-object-widget.c (SOW_MAKE_TYPE): add fn_draw_cairo,
        change all uses of this macro
        (draw_cairo_text): new
diff --git a/src/sheet-object-widget.c b/src/sheet-object-widget.c
index bc49da7..a880e18 100644
--- a/src/sheet-object-widget.c
+++ b/src/sheet-object-widget.c
@@ -576,6 +576,85 @@ sheet_widget_frame_user_config (SheetObject *so, SheetControl *sc)
        gtk_widget_show (state->dialog);
 }
 
+static void
+draw_cairo_text (cairo_t *cr, char const *text, int *pwidth, int *pheight,
+                gboolean centered)
+{
+       PangoLayout *layout = pango_cairo_create_layout (cr);
+       PangoFontDescription *desc;
+       /* Using GtkStyle does not seem to work in ssconvert */
+       /* GtkStyle *style = gtk_style_new (); */
+       double const scale_h = 72. / gnm_app_display_dpi_get (TRUE);
+       double const scale_v = 72. / gnm_app_display_dpi_get (FALSE);
+       int width, height;
+
+       /* pango_layout_set_font_description (layout, style->font_desc); */
+       desc = pango_font_description_from_string ("sans 10");
+       pango_context_set_font_description
+               (pango_layout_get_context (layout), desc);
+       pango_layout_set_single_paragraph_mode (layout, TRUE);
+       pango_layout_set_text (layout, text, -1);
+       pango_layout_get_pixel_size (layout, &width, &height);
+
+       cairo_scale (cr, scale_h, scale_v);
+       if (centered)
+               cairo_rel_move_to (cr, 0., 0.5 - ((double)height)/2.);
+       pango_cairo_show_layout (cr, layout);
+       pango_font_description_free (desc);
+       g_object_unref (layout);
+       /* g_object_unref (style); */
+       
+       if (pwidth)
+               *pwidth = width * scale_h;
+       if (pheight)
+               *pheight = height * scale_v;
+}
+
+static void
+sheet_widget_frame_draw_cairo (SheetObject const *so, cairo_t *cr,
+                              double width, double height)
+{
+       /* See bugs #705638 and #705640 */
+       if (NULL != gdk_screen_get_default ()) {
+               sheet_widget_draw_cairo (so, cr, width, height);
+       } else {
+               SheetWidgetFrame *swf = GNM_SOW_FRAME (so);
+
+               int theight = 0, twidth = 0;
+               cairo_save (cr);
+               cairo_move_to (cr, 10, 0);
+
+               cairo_save (cr);
+               draw_cairo_text (cr, swf->label, &twidth, &theight, FALSE);
+               cairo_restore (cr);
+
+               cairo_set_line_width (cr, 1);
+               cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+               cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
+               cairo_new_path (cr);
+               cairo_move_to (cr, 6, theight/2);
+               cairo_line_to (cr, 0, theight/2);
+               cairo_line_to (cr, 0, height);
+               cairo_line_to (cr, width, height);
+               cairo_line_to (cr, width, theight/2);
+               cairo_line_to (cr, 14 + twidth, theight/2);
+               cairo_stroke (cr);
+
+               cairo_set_source_rgb(cr, 0.8, 0.8, 0.8);
+               cairo_new_path (cr);
+               cairo_move_to (cr, 6, theight/2 + 1);
+               cairo_line_to (cr, 1, theight/2 + 1);
+               cairo_line_to (cr, 1, height - 1);
+               cairo_line_to (cr, width - 1, height - 1);
+               cairo_line_to (cr, width - 1, theight/2 + 1);
+               cairo_line_to (cr, 14 + twidth, theight/2 + 1);
+               cairo_stroke (cr);
+
+               cairo_new_path (cr);
+               cairo_restore (cr);
+       }
+}
+
 SOW_MAKE_TYPE (frame, Frame,
               sheet_widget_frame_user_config,
               NULL,
@@ -586,7 +665,7 @@ SOW_MAKE_TYPE (frame, Frame,
               sheet_widget_frame_prep_sax_parser,
               sheet_widget_frame_get_property,
               sheet_widget_frame_set_property,
-              sheet_widget_draw_cairo,
+              sheet_widget_frame_draw_cairo,
               {
                       g_object_class_install_property
                               (object_class, SOF_PROP_TEXT,
@@ -1049,6 +1128,64 @@ sheet_widget_button_set_markup (SheetObject *so, PangoAttrList *markup)
        }
 }
 
+static void
+sheet_widget_button_draw_cairo (SheetObject const *so, cairo_t *cr,
+                               double width, double height)
+{
+       /* See bugs #705638 and #705640 */
+       if (NULL != gdk_screen_get_default ()) {
+               sheet_widget_draw_cairo (so, cr, width, height);
+       } else {
+               SheetWidgetButton *swb = GNM_SOW_BUTTON (so);
+               PangoLayout *layout = pango_cairo_create_layout (cr);
+               GtkStyle *style = gtk_style_new ();
+               double const scale_h = 72. / gnm_app_display_dpi_get (TRUE);
+               double const scale_v = 72. / gnm_app_display_dpi_get (FALSE);
+               int twidth, theight;
+               int const half_line = 1.5;
+               int radius = 10;
+
+               if (height < 3 * radius)
+                       radius = height / 3.;
+               if (width < 3 * radius)
+                       radius = width / 3.;
+               if (radius < 1)
+                       radius = 1;
+
+               cairo_save (cr);
+               cairo_set_line_width (cr, 2 * half_line);
+               cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
+
+               cairo_new_path (cr);
+               cairo_arc (cr, radius + half_line, radius + half_line, radius, M_PI, - M_PI/2);
+               cairo_arc (cr, width - (radius + half_line), radius + half_line,
+                          radius, - M_PI/2, 0);
+               cairo_arc (cr, width - (radius + half_line), height - (radius + half_line),
+                          radius, 0, M_PI/2);
+               cairo_arc (cr, (radius + half_line), height - (radius + half_line),
+                          radius, M_PI/2, M_PI);
+               cairo_close_path (cr);
+               cairo_stroke (cr);
+
+               cairo_set_source_rgb(cr, 0, 0, 0);
+               pango_layout_set_font_description (layout, style->font_desc);
+               pango_layout_set_single_paragraph_mode (layout, TRUE);
+               pango_layout_set_text (layout, swb->label, -1);
+               pango_layout_set_attributes (layout, swb->markup);
+               pango_layout_get_pixel_size (layout, &twidth, &theight);
+
+               cairo_move_to (cr, width/2., height/2.);
+               cairo_scale (cr, scale_h, scale_v);
+               cairo_rel_move_to (cr, - twidth/2., - theight/2.);
+               pango_cairo_show_layout (cr, layout);
+               g_object_unref (layout);
+               g_object_unref (style);
+
+               cairo_new_path (cr);
+               cairo_restore (cr);
+       }
+}
+
 SOW_MAKE_TYPE (button, Button,
               sheet_widget_button_user_config,
               sheet_widget_button_set_sheet,
@@ -1059,7 +1196,7 @@ SOW_MAKE_TYPE (button, Button,
               sheet_widget_button_prep_sax_parser,
               sheet_widget_button_get_property,
               sheet_widget_button_set_property,
-              sheet_widget_draw_cairo,
+              sheet_widget_button_draw_cairo,
               {
                       g_object_class_install_property
                               (object_class, SOB_PROP_TEXT,
@@ -1696,13 +1833,74 @@ sheet_widget_scrollbar_user_config (SheetObject *so, SheetControl *sc)
                                                  N_("Scrollbar Properties"));
 }
 
+static void sheet_widget_slider_horizontal_draw_cairo
+(SheetObject const *so, cairo_t *cr, double width, double height);
+
+static void
+sheet_widget_scrollbar_horizontal_draw_cairo (SheetObject const *so, cairo_t *cr,
+                                             double width, double height)
+{
+       cairo_save (cr);
+       cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
+
+       cairo_new_path (cr);
+       cairo_move_to (cr, 0., height/2);
+       cairo_rel_line_to (cr, 15., 7.5);
+       cairo_rel_line_to (cr, 0, -15);
+       cairo_close_path (cr);
+       cairo_fill (cr);
+
+       cairo_new_path (cr);
+       cairo_move_to (cr, width, height/2);
+       cairo_rel_line_to (cr, -15., 7.5);
+       cairo_rel_line_to (cr, 0, -15);
+       cairo_close_path (cr);
+       cairo_fill (cr);
+
+       cairo_new_path (cr);
+       cairo_translate (cr, 15., 0.);
+       sheet_widget_slider_horizontal_draw_cairo (so, cr, width - 30, height);
+       cairo_restore (cr);
+}
+
+static void
+sheet_widget_scrollbar_vertical_draw_cairo (SheetObject const *so, cairo_t *cr,
+                                           double width, double height)
+{
+       cairo_save (cr);
+       cairo_rotate (cr, M_PI/2);
+       cairo_translate (cr, 0., -width);
+       sheet_widget_scrollbar_horizontal_draw_cairo (so, cr, height, width);
+       cairo_restore (cr);
+}
+
+static void
+sheet_widget_scrollbar_draw_cairo (SheetObject const *so, cairo_t *cr,
+                                  double width, double height)
+{
+       /* See bugs #705638 and #705640 */
+       if (NULL != gdk_screen_get_default ()) {
+               sheet_widget_draw_cairo (so, cr, width, height);
+       } else {
+               SheetWidgetAdjustment *swa = GNM_SOW_ADJUSTMENT (so);
+               if (swa->horizontal)
+                       sheet_widget_scrollbar_horizontal_draw_cairo
+                               (so, cr, width, height);
+               else
+                       sheet_widget_scrollbar_vertical_draw_cairo
+                               (so, cr, width, height);
+       }
+}
+
 static void
 sheet_widget_scrollbar_class_init (SheetObjectWidgetClass *sow_class)
 {
        SheetWidgetAdjustmentClass *swa_class = (SheetWidgetAdjustmentClass *)sow_class;
+       SheetObjectClass *so_class = SHEET_OBJECT_CLASS (sow_class);
 
         sow_class->create_widget = &sheet_widget_scrollbar_create_widget;
-       SHEET_OBJECT_CLASS (sow_class)->user_config = &sheet_widget_scrollbar_user_config;
+       so_class->user_config = &sheet_widget_scrollbar_user_config;
+       so_class->draw_cairo = &sheet_widget_scrollbar_draw_cairo;
        swa_class->type = GTK_TYPE_SCROLLBAR;
 }
 
@@ -1745,12 +1943,73 @@ sheet_widget_spinbutton_user_config (SheetObject *so, SheetControl *sc)
 }
 
 static void
+sheet_widget_spinbutton_draw_cairo (SheetObject const *so, cairo_t *cr,
+                                   double width, double height)
+{
+       /* See bugs #705638 and #705640 */
+       if (NULL != gdk_screen_get_default ()) {
+               sheet_widget_draw_cairo (so, cr, width, height);
+       } else {
+               SheetWidgetAdjustment *swa = GNM_SOW_ADJUSTMENT (so);
+               GtkAdjustment *adjustment = swa->adjustment;
+               double value = gtk_adjustment_get_value (adjustment);
+               int ivalue = (int) value;
+               double halfheight = height/2;
+               char *str;
+
+               cairo_save (cr);
+               cairo_set_line_width (cr, 0.5);
+               cairo_set_source_rgb(cr, 0, 0, 0);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, 0, 0);
+               cairo_line_to (cr, width, 0);
+               cairo_line_to (cr, width, height);
+               cairo_line_to (cr, 0, height);
+               cairo_close_path (cr);
+               cairo_stroke (cr);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, width - 10, 0);
+               cairo_rel_line_to (cr, 0, height);
+               cairo_stroke (cr);
+
+               cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, width - 5, 3);
+               cairo_rel_line_to (cr, 3, 3);
+               cairo_rel_line_to (cr, -6, 0);
+               cairo_close_path (cr);
+               cairo_fill (cr);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, width - 5, height - 3);
+               cairo_rel_line_to (cr, 3, -3);
+               cairo_rel_line_to (cr, -6, 0);
+               cairo_close_path (cr);
+               cairo_fill (cr);
+
+               str = g_strdup_printf ("%i", ivalue);
+               cairo_set_source_rgb(cr, 0, 0, 0);
+               cairo_move_to (cr, 4., halfheight);
+               draw_cairo_text (cr, str, NULL, NULL, TRUE);
+               g_free (str);
+
+               cairo_new_path (cr);
+               cairo_restore (cr);
+       }
+}
+
+static void
 sheet_widget_spinbutton_class_init (SheetObjectWidgetClass *sow_class)
 {
        SheetWidgetAdjustmentClass *swa_class = (SheetWidgetAdjustmentClass *)sow_class;
+       SheetObjectClass *so_class = SHEET_OBJECT_CLASS (sow_class);
 
         sow_class->create_widget = &sheet_widget_spinbutton_create_widget;
-       SHEET_OBJECT_CLASS (sow_class)->user_config = &sheet_widget_spinbutton_user_config;
+       so_class->user_config = &sheet_widget_spinbutton_user_config;
+       so_class->draw_cairo = &sheet_widget_spinbutton_draw_cairo;
 
        swa_class->type = GTK_TYPE_SPIN_BUTTON;
        swa_class->has_orientation = FALSE;
@@ -1794,12 +2053,76 @@ sheet_widget_slider_user_config (SheetObject *so, SheetControl *sc)
 }
 
 static void
+sheet_widget_slider_horizontal_draw_cairo (SheetObject const *so, cairo_t *cr,
+                                          double width, double height)
+{
+       SheetWidgetAdjustment *swa = GNM_SOW_ADJUSTMENT (so);
+       GtkAdjustment *adjustment = swa->adjustment;
+       double value = gtk_adjustment_get_value (adjustment);
+       double upper = gtk_adjustment_get_upper (adjustment);
+       double lower = gtk_adjustment_get_lower (adjustment);
+       double fraction = (upper == lower) ? 0.0 : (value - lower)/(upper- lower);
+
+       cairo_save (cr);
+       cairo_set_line_width (cr, 5);
+       cairo_set_source_rgb(cr, 0.8, 0.8, 0.8);
+       cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+
+       cairo_new_path (cr);
+       cairo_move_to (cr, 4, height/2);
+       cairo_rel_line_to (cr, width - 8., 0);
+       cairo_stroke (cr);
+
+       cairo_set_line_width (cr, 15);
+       cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
+       cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
+
+       cairo_new_path (cr);
+       cairo_move_to (cr, fraction * (width - 8. - 20. - 5. - 5. + 2.5 + 2.5)
+                      - 10. + 10. + 4. + 5. - 2.5, height/2);
+       cairo_rel_line_to (cr, 20, 0);
+       cairo_stroke (cr);
+
+       cairo_new_path (cr);
+       cairo_restore (cr);
+}
+
+static void
+sheet_widget_slider_vertical_draw_cairo (SheetObject const *so, cairo_t *cr,
+                                        double width, double height)
+{
+       cairo_save (cr);
+       cairo_rotate (cr, M_PI/2);
+       cairo_translate (cr, 0., -width);
+       sheet_widget_slider_horizontal_draw_cairo (so, cr, height, width);
+       cairo_restore (cr);
+}
+
+static void
+sheet_widget_slider_draw_cairo (SheetObject const *so, cairo_t *cr,
+                               double width, double height)
+{
+       /* See bugs #705638 and #705640 */
+       if (NULL != gdk_screen_get_default ()) {
+               sheet_widget_draw_cairo (so, cr, width, height);
+       } else {
+               SheetWidgetAdjustment *swa = GNM_SOW_ADJUSTMENT (so);
+               if (swa->horizontal)
+                       sheet_widget_slider_horizontal_draw_cairo (so, cr, width, height);
+               else
+                       sheet_widget_slider_vertical_draw_cairo (so, cr, width, height);
+       }
+}
+
+static void
 sheet_widget_slider_class_init (SheetObjectWidgetClass *sow_class)
 {
        SheetWidgetAdjustmentClass *swa_class = (SheetWidgetAdjustmentClass *)sow_class;
+       SheetObjectClass *so_class = SHEET_OBJECT_CLASS (sow_class);
 
         sow_class->create_widget = &sheet_widget_slider_create_widget;
-       SHEET_OBJECT_CLASS (sow_class)->user_config = &sheet_widget_slider_user_config;
+       so_class->user_config = &sheet_widget_slider_user_config;
+       so_class->draw_cairo = &sheet_widget_slider_draw_cairo;
 
        swa_class->type = GTK_TYPE_SCALE;
 }
@@ -2263,33 +2586,6 @@ sheet_widget_checkbox_set_label  (SheetObject *so, char const *str)
 }
 
 static void
-draw_cairo_text (cairo_t *cr, char const *text)
-{
-       PangoLayout *layout = pango_cairo_create_layout (cr);
-       PangoFontDescription *desc;
-       /* Using GtkStyle does not seem to work in ssconvert */
-       /* GtkStyle *style = gtk_style_new (); */
-       double const scale_h = 72. / gnm_app_display_dpi_get (TRUE);
-       double const scale_v = 72. / gnm_app_display_dpi_get (FALSE);
-       int width, height;
-
-       /* pango_layout_set_font_description (layout, style->font_desc); */
-       desc = pango_font_description_from_string ("sans 10");
-       pango_context_set_font_description
-               (pango_layout_get_context (layout), desc);
-       pango_layout_set_single_paragraph_mode (layout, TRUE);
-       pango_layout_set_text (layout, text, -1);
-       pango_layout_get_pixel_size (layout, &width, &height);
-
-       cairo_scale (cr, scale_h, scale_v);
-       cairo_rel_move_to (cr, 0., 0.5 - ((double)height)/2.);
-       pango_cairo_show_layout (cr, layout);
-       pango_font_description_free (desc);
-       g_object_unref (layout);
-       /* g_object_unref (style); */
-}
-
-static void
 sheet_widget_checkbox_draw_cairo (SheetObject const *so, cairo_t *cr,
                                  double width, double height)
 {
@@ -2297,7 +2593,7 @@ sheet_widget_checkbox_draw_cairo (SheetObject const *so, cairo_t *cr,
        if (NULL != gdk_screen_get_default ()) {
                sheet_widget_draw_cairo (so, cr, width, height);
        } else {
-               SheetWidgetCheckbox const *swc = (SheetWidgetCheckbox const *)so;
+               SheetWidgetCheckbox const *swc = GNM_SOW_CHECKBOX (so);
                double halfheight = height/2;
 
                cairo_save (cr);
@@ -2329,7 +2625,7 @@ sheet_widget_checkbox_draw_cairo (SheetObject const *so, cairo_t *cr,
 
                cairo_move_to (cr, 4. + 8. + 4, halfheight);
 
-               draw_cairo_text (cr, swc->label);
+               draw_cairo_text (cr, swc->label, NULL, NULL, TRUE);
 
                cairo_new_path (cr);
                cairo_restore (cr);
@@ -2944,7 +3240,7 @@ sheet_widget_radio_button_draw_cairo (SheetObject const *so, cairo_t *cr,
        if (NULL != gdk_screen_get_default ()) {
                sheet_widget_draw_cairo (so, cr, width, height);
        } else {
-               SheetWidgetRadioButton const *swr = (SheetWidgetRadioButton const *)so;
+               SheetWidgetRadioButton const *swr = GNM_SOW_RADIO_BUTTON (so);
                double halfheight = height/2;
 
                cairo_save (cr);
@@ -2969,7 +3265,7 @@ sheet_widget_radio_button_draw_cairo (SheetObject const *so, cairo_t *cr,
 
                cairo_move_to (cr, 4. + 8. + 4, halfheight);
 
-               draw_cairo_text (cr, swr->label);
+               draw_cairo_text (cr, swr->label, NULL, NULL, TRUE);
 
                cairo_new_path (cr);
                cairo_restore (cr);
@@ -3480,8 +3776,129 @@ sheet_widget_list_create_widget (SheetObjectWidget *sow)
 }
 
 static void
+sheet_widget_list_draw_cairo (SheetObject const *so, cairo_t *cr,
+                             double width, double height)
+{
+       /* See bugs #705638 and #705640 */
+       if (NULL != gdk_screen_get_default ()) {
+               sheet_widget_draw_cairo (so, cr, width, height);
+       } else {
+               SheetWidgetListBase *swl = GNM_SOW_LIST_BASE (so);
+
+               cairo_save (cr);
+               cairo_set_line_width (cr, 0.5);
+               cairo_set_source_rgb(cr, 0, 0, 0);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, 0, 0);
+               cairo_line_to (cr, width, 0);
+               cairo_line_to (cr, width, height);
+               cairo_line_to (cr, 0, height);
+               cairo_close_path (cr);
+               cairo_stroke (cr);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, width - 10, 0);
+               cairo_rel_line_to (cr, 0, height);
+               cairo_stroke (cr);
+
+               cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, width - 5 -3, height - 12);
+               cairo_rel_line_to (cr, 6, 0);
+               cairo_rel_line_to (cr, -3, 8);
+               cairo_close_path (cr);
+               cairo_fill (cr);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, width - 5 -3, 12);
+               cairo_rel_line_to (cr, 6, 0);
+               cairo_rel_line_to (cr, -3, -8);
+               cairo_close_path (cr);
+               cairo_fill (cr);
+
+               if (swl->model != NULL) {
+                       GtkTreeIter iter;
+                       GString*str = g_string_new (NULL);
+                       PangoLayout *layout = pango_cairo_create_layout (cr);
+                       /* Using GtkStyle does not seem to work in ssconvert */
+                       /* GtkStyle *style = gtk_style_new (); */
+                       PangoFontDescription *desc;
+                       double const scale_h = 72. / gnm_app_display_dpi_get (TRUE);
+                       double const scale_v = 72. / gnm_app_display_dpi_get (FALSE);
+                       int twidth = 0, theight = 0;
+                       PangoLayoutIter *pliter;
+                       int y0, y1, i;
+                       double dy0 = 0, dy1 = 0;
+                       gboolean got_line = TRUE;
+
+                       
+                       cairo_new_path (cr);
+                       cairo_rectangle (cr, 2, 1, width - 2 - 12, height - 2);
+                       cairo_clip (cr);
+                       if (gtk_tree_model_get_iter_first (swl->model, &iter))
+                               do {
+                                       char *astr = NULL, *newline;
+                                       gtk_tree_model_get (swl->model, &iter, 0, &astr, -1);
+                                       while (NULL != (newline = strchr (astr, '\n')))
+                                               *newline = ' ';
+                                       g_string_append (str, astr);
+                                       g_string_append_c (str, '\n');
+                                       g_free (astr);
+                               } while (gtk_tree_model_iter_next (swl->model, &iter));
+
+                       /* pango_layout_set_font_description (layout, style->font_desc); */
+                       desc = pango_font_description_from_string ("sans 10");
+                       pango_context_set_font_description
+                               (pango_layout_get_context (layout), desc);
+                       pango_layout_set_single_paragraph_mode (layout, FALSE);
+                       pango_layout_set_spacing (layout, 3 * PANGO_SCALE);
+                       pango_layout_set_text (layout, str->str, -1);
+                       pango_layout_get_pixel_size (layout, &twidth, &theight);
+
+                       cairo_translate (cr, 4., 2.);
+                       cairo_scale (cr, scale_h, scale_v);
+
+                       pliter = pango_layout_get_iter (layout);
+                       for (i = 1; i < swl->selection; i++)
+                               got_line = pango_layout_iter_next_line (pliter);
+
+                       if (got_line) {
+                               pango_layout_iter_get_line_yrange (pliter, &y0, &y1);
+                               dy0 = y0 / (double)PANGO_SCALE;
+                               dy1 = y1 / (double)PANGO_SCALE;
+
+                               if (dy1 > (height - 4)/scale_v)
+                                       cairo_translate (cr, 0, (height - 4)/scale_v - dy1);
+
+                               cairo_new_path (cr);
+                               cairo_rectangle (cr, -4/scale_h, dy0,
+                                                width/scale_h, dy1 - dy0);
+                               cairo_set_source_rgb(cr, 0.8, 0.8, 0.8);
+                               cairo_fill (cr);
+                       }
+                       pango_layout_iter_free (pliter);
+                       cairo_set_source_rgb(cr, 0, 0, 0);
+                       pango_cairo_show_layout (cr, layout);
+                       g_object_unref (layout);
+                       /* g_object_unref (style); */
+                       pango_font_description_free (desc);
+
+                       g_string_free (str, TRUE);
+               }
+
+               cairo_new_path (cr);
+               cairo_restore (cr);
+       }
+}
+
+static void
 sheet_widget_list_class_init (SheetObjectWidgetClass *sow_class)
 {
+       SheetObjectClass *so_class = SHEET_OBJECT_CLASS (sow_class);
+
+       so_class->draw_cairo = &sheet_widget_list_draw_cairo;
         sow_class->create_widget = &sheet_widget_list_create_widget;
 }
 
@@ -3559,8 +3976,67 @@ sheet_widget_combo_create_widget (SheetObjectWidget *sow)
 }
 
 static void
+sheet_widget_combo_draw_cairo (SheetObject const *so, cairo_t *cr,
+                              double width, double height)
+{
+       /* See bugs #705638 and #705640 */
+       if (NULL != gdk_screen_get_default ()) {
+               sheet_widget_draw_cairo (so, cr, width, height);
+       } else {
+               SheetWidgetListBase *swl = GNM_SOW_LIST_BASE (so);
+               double halfheight = height/2;
+
+               cairo_save (cr);
+               cairo_set_line_width (cr, 0.5);
+               cairo_set_source_rgb(cr, 0, 0, 0);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, 0, 0);
+               cairo_line_to (cr, width, 0);
+               cairo_line_to (cr, width, height);
+               cairo_line_to (cr, 0, height);
+               cairo_close_path (cr);
+               cairo_stroke (cr);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, width - 10, 0);
+               cairo_rel_line_to (cr, 0, height);
+               cairo_stroke (cr);
+
+               cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
+
+               cairo_new_path (cr);
+               cairo_move_to (cr, width - 5 -3, halfheight - 4);
+               cairo_rel_line_to (cr, 6, 0);
+               cairo_rel_line_to (cr, -3, 8);
+               cairo_close_path (cr);
+               cairo_fill (cr);
+
+               cairo_set_source_rgb(cr, 0, 0, 0);
+               cairo_move_to (cr, 4., halfheight);
+
+               if (swl->model != NULL) {
+                       GtkTreeIter iter;
+                       if (gtk_tree_model_iter_nth_child (swl->model, &iter, NULL,
+                                                          swl->selection - 1)) {
+                               char *str = NULL;
+                               gtk_tree_model_get (swl->model, &iter, 0, &str, -1);
+                               draw_cairo_text (cr, str, NULL, NULL, TRUE);
+                               g_free (str);
+                       }
+               }
+
+               cairo_new_path (cr);
+               cairo_restore (cr);
+       }
+}
+
+static void
 sheet_widget_combo_class_init (SheetObjectWidgetClass *sow_class)
 {
+       SheetObjectClass *so_class = SHEET_OBJECT_CLASS (sow_class);
+
+       so_class->draw_cairo = &sheet_widget_combo_draw_cairo;
         sow_class->create_widget = &sheet_widget_combo_create_widget;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]