static void cb_format_hash_style (GnmFT *ft, GnmRange *r, GnmStyle *mstyle, gpointer user) { GHashTable *table = user; int row, col; /* * Filter out undesired elements */ mstyle = format_template_filter_style (ft, mstyle, TRUE); for (row = r->start.row; row <= r->end.row; row++) for (col = r->start.col; col <= r->end.col; col++) { GnmCellPos key; key.col = col; key.row = row; g_hash_table_insert (table, g_memdup (&key, sizeof (key)), gnm_style_dup (mstyle)); } /* * Unref here, the hashtable will take care of its own * resources */ gnm_style_unref (mstyle); }
static void thrash_insert (Sheet *sheet) { int j; GnmStyle *style1 = gnm_style_new (); GnmStyle *style2 = gnm_style_new (); gnm_style_set_font_bold (style1, TRUE); gnm_style_set_font_italic (style1, TRUE); gnm_style_set_font_size (style2, 20.0); for (j = 0; j < INSERT_HEIGHT; j++) { GnmRange r; int i; for (i = 0; i < INSERT_WIDTH; i++) { GnmCell *cell; GnmStyle *setstyle; r.start.col = i; r.start.row = j; r.end = r.start; if (((i / 31) % 2) == 0) setstyle = style1; else setstyle = style2; gnm_style_ref (setstyle); sheet_style_attach (sheet, &r, setstyle); cell = sheet_cell_fetch (sheet, i, j); gnm_cell_set_value (cell, value_new_int (i), NULL); } r.start.col = 0; r.start.row = MAX (0, j - 1); r.end.col = gnm_sheet_get_max_cols (sheet); r.end.row = MIN (gnm_sheet_get_max_rows (sheet), j + 1); sheet_style_optimize (sheet, r); } gnm_style_unref (style1); gnm_style_unref (style2); }
void sylk_file_open (GOFileOpener const *fo, GOIOContext *io_context, WorkbookView *wb_view, GsfInput *input) { SylkReader state; char const *input_name; char *name = NULL; int i; GnmLocale *locale; memset (&state, 0, sizeof (state)); state.io_context = io_context; state.input = (GsfInputTextline *) gsf_input_textline_new (input); state.converter = g_iconv_open ("UTF-8", "ISO-8859-1"); state.finished = FALSE; state.line_no = 0; state.pp.wb = wb_view_get_workbook (wb_view); if (NULL == (input_name = gsf_input_name (input)) || NULL == (name = g_path_get_basename (input_name)) || '\0' == *name) { g_free (name); name = g_strdup ("Sheet"); } state.pp.sheet = sheet_new (state.pp.wb, name, 256, 65536); workbook_sheet_attach (state.pp.wb, state.pp.sheet); g_free (name); state.pp.eval.col = state.pp.eval.row = 1; state.convs = gnm_conventions_xls_r1c1; state.formats = g_ptr_array_new (); state.fonts = g_ptr_array_new (); locale = gnm_push_C_locale (); sylk_parse_sheet (&state); gnm_pop_C_locale (locale); workbook_set_saveinfo (state.pp.wb, GO_FILE_FL_AUTO, go_file_saver_for_id ("Gnumeric_sylk:sylk")); for (i = state.fonts->len ; i-- > 0 ; ) gnm_style_unref (g_ptr_array_index (state.fonts, i)); g_ptr_array_free (state.fonts, TRUE); for (i = state.formats->len ; i-- > 0 ; ) go_format_unref (g_ptr_array_index (state.formats, i)); g_ptr_array_free (state.formats, TRUE); gsf_iconv_close (state.converter); g_object_unref (G_OBJECT (state.input)); }
/** * gnm_ft_member_free: * @member: GnmFTMember * * Frees an existing template member **/ static void gnm_ft_member_free (GnmFTMember *member) { g_return_if_fail (member != NULL); if (member->mstyle) { gnm_style_unref (member->mstyle); member->mstyle = NULL; } g_free (member); }
static void cb_entry_cursor_pos (WBCGtk *wbcg) { gint start, end, target_pos_in_chars, target_pos_in_bytes; GtkEditable *entry = GTK_EDITABLE (wbcg_get_entry (wbcg)); char const *str = gtk_entry_get_text (GTK_ENTRY (entry)); int edit_pos = gtk_editable_get_position (entry); if (str[0] == 0) return; if (edit_pos != gtk_entry_get_text_length (GTK_ENTRY (entry))) { /* The cursor is no longer at the end. */ wbcg->auto_completing = FALSE; } if (!wbcg->edit_line.full_content) return; /* 1) Use first selected character if there is a selection * 2) Use the character just before the edit pos if it exists * 3) Use the first character */ if (gtk_editable_get_selection_bounds (entry, &start, &end)) target_pos_in_chars = start; else { target_pos_in_chars = edit_pos; if (target_pos_in_chars > 0) target_pos_in_chars--; } target_pos_in_bytes = g_utf8_offset_to_pointer (str, target_pos_in_chars) - str; /* Make bold/italic/etc buttons show the right thing. */ { GnmStyle *style = gnm_style_new (); GSList *ptr, *attrs = attrs_at_byte (wbcg->edit_line.full_content, target_pos_in_bytes); for (ptr = attrs; ptr != NULL ; ptr = ptr->next) { PangoAttribute *attr = ptr->data; gnm_style_set_from_pango_attribute (style, attr); pango_attribute_destroy (attr); } wb_control_style_feedback (GNM_WBC (wbcg), style); gnm_style_unref (style); g_slist_free (attrs); } set_cur_fmt (wbcg, target_pos_in_bytes); }
static void preview_grid_dispose (GObject *obj) { GnmPreviewGrid *pg = GNM_PREVIEW_GRID (obj); if (pg->defaults.style != NULL) { gnm_style_unref (pg->defaults.style); pg->defaults.style = NULL; } value_release (pg->defaults.value); pg->defaults.value = NULL; g_clear_object (&pg->sheet); G_OBJECT_CLASS (parent_klass)->dispose (obj); }
static void add_worksheet(Workbook *wb, psiconv_sheet_worksheet psi_worksheet,int nr, psiconv_formula_list psi_formulas) { Sheet *sheet; char *sheet_name; GnmStyle *default_style; psiconv_sheet_grid_section grid; sheet_name = g_strdup_printf (_("Sheet%d"),nr); sheet = sheet_new (wb, sheet_name, 256, 65536); g_free (sheet_name); if (!sheet) return; /* Default layout */ default_style = gnm_style_new_default(); if (!default_style) { g_object_unref (sheet); return; } set_layout(default_style,psi_worksheet->default_layout); /* TODO: Add show_zeros */ grid = psi_worksheet->grid; if (grid) { sheet_row_set_default_size_pts (sheet, cm2pts (grid->default_row_height)); sheet_col_set_default_size_pts (sheet, cm2pts (grid->default_column_width)); if (grid->row_heights) set_row_heights (sheet, grid->row_heights); if (grid->column_heights) set_col_widths (sheet, grid->column_heights); } add_cells(sheet,psi_worksheet->cells,psi_formulas,default_style); /* TODO: What about the NULL? */ sheet_flag_recompute_spans(sheet); workbook_sheet_attach (wb, sheet); gnm_style_unref (default_style); }
static void preview_grid_set_property (GObject *obj, guint param_id, GValue const *value, GParamSpec *pspec) { GnmPreviewGrid *pg = GNM_PREVIEW_GRID (obj); switch (param_id){ case PREVIEW_GRID_PROP_RENDER_GRIDLINES : pg->gridlines = g_value_get_boolean (value); break; case PREVIEW_GRID_PROP_DEFAULT_COL_WIDTH : pg->defaults.col_width = g_value_get_uint (value); break; case PREVIEW_GRID_PROP_DEFAULT_ROW_HEIGHT : pg->defaults.row_height = g_value_get_uint (value); break; case PREVIEW_GRID_PROP_DEFAULT_STYLE : { /* add a ref */ GnmStyle *style = g_value_get_pointer (value); g_return_if_fail (style != NULL); gnm_style_ref (style); gnm_style_unref (pg->defaults.style); pg->defaults.style = style; break; } case PREVIEW_GRID_PROP_DEFAULT_VALUE : { /* steal ownership */ GnmValue *val = g_value_get_pointer (value); g_return_if_fail (val != NULL); if (pg->defaults.value != val) { value_release (pg->defaults.value); pg->defaults.value = val; } break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec); return; /* NOTE : RETURN */ } goc_item_invalidate (GOC_ITEM (obj)); }
static void html_read_row (htmlNodePtr cur, htmlDocPtr doc, GnmHtmlTableCtxt *tc) { htmlNodePtr ptr; int col = -1; for (ptr = cur->children; ptr != NULL ; ptr = ptr->next) { if (xmlStrEqual (ptr->name, CC2XML ("td")) || xmlStrEqual (ptr->name, CC2XML ("th"))) { GString *buf; xmlBufferPtr a_buf; xmlAttrPtr props; int colspan = 1; int rowspan = 1; GnmCellPos pos; GnmStyle *mstyle; GSList *hrefs = NULL; GnmHLink *lnk = NULL; /* Check whether we need to skip merges from above */ pos.row = tc->row; pos.col = col + 1; while (gnm_sheet_merge_contains_pos (tc->sheet, &pos)) { col++; pos.col++; } /* Do we span across multiple rows or cols? */ props = ptr->properties; while (props) { if (xmlStrEqual (props->name, CC2XML ("colspan")) && props->children) colspan = atoi (CXML2C (props->children->content)); if (xmlStrEqual (props->name, CC2XML ("rowspan")) && props->children) rowspan = atoi (CXML2C (props->children->content)); props = props->next; } if (colspan < 1) colspan = 1; if (rowspan < 1) rowspan = 1; /* Let's figure out the content of the cell */ buf = g_string_new (NULL); a_buf = xmlBufferCreate (); mstyle = gnm_style_new_default (); if (xmlStrEqual (ptr->name, CC2XML ("th"))) gnm_style_set_font_bold (mstyle, TRUE); html_read_content (ptr, buf, mstyle, a_buf, &hrefs, TRUE, doc, tc); if (g_slist_length (hrefs) >= 1 && buf->len > 0) { /* One hyperlink, and text to make it * visible */ char *url; xmlBufferPtr h_buf = xmlBufferCreate (); hrefs = g_slist_reverse (hrefs); htmlNodeDump ( h_buf, doc, (htmlNodePtr)hrefs->data); url = g_strndup ( CXML2C (h_buf->content), h_buf->use); if (strncmp (url, "mailto:", strlen ("mailto:")) == 0) lnk = gnm_hlink_new ( gnm_hlink_email_get_type (), tc->sheet); else lnk = gnm_hlink_new ( gnm_hlink_url_get_type (), tc->sheet); gnm_hlink_set_target (lnk, url); gnm_style_set_hlink (mstyle, lnk); gnm_style_set_font_uline (mstyle, UNDERLINE_SINGLE); gnm_style_set_font_color (mstyle, gnm_color_new_go (GO_COLOR_BLUE)); g_free (url); xmlBufferFree (h_buf); } if (g_slist_length (hrefs) > 1 || buf->len <= 0) { /* Multiple links, * or no text to give hyperlink style, * so put them in a comment */ GSList *l; for (l = hrefs; l != NULL; l = l->next) { htmlNodeDump (a_buf, doc, (htmlNodePtr)l->data); xmlBufferAdd (a_buf, CC2XML ("\n"), -1); } } g_slist_free (hrefs); if (buf->len > 0) { GnmCell *cell = sheet_cell_fetch (tc->sheet, col + 1, tc->row); sheet_style_set_pos (tc->sheet, col + 1, tc->row, mstyle); gnm_cell_set_text (cell, buf->str); } else gnm_style_unref (mstyle); if (a_buf->use > 0) { char *name; name = g_strndup (CXML2C (a_buf->content), a_buf->use); cell_set_comment (tc->sheet, &pos, NULL, name, NULL); g_free (name); } g_string_free (buf, TRUE); xmlBufferFree (a_buf); /* If necessary create the merge */ if (colspan > 1 || rowspan > 1) { GnmRange range; GnmRange *r = ⦥ range_init (r, col + 1, tc->row, col + colspan, tc->row + rowspan - 1); gnm_sheet_merge_add (tc->sheet, r, FALSE, NULL); } col += colspan; } } }
void gnumeric_free_style(GnumericStylePtr style) { gnm_style_unref((GnmStyle*)style); }
/** * format_template_filter_style: * @ft: * @mstyle: * @fill_defaults: If set fill in the gaps with the "default" mstyle. * * Filter an mstyle and strip and replace certain elements * based on what the user wants to apply. * Basically you should pass FALSE as @fill_defaults, unless you want to have * a completely filled style to be returned. If you set @fill_default to TRUE * the returned mstyle might have some of its elements 'not set' * * Return value: The same mstyle as @mstyle with most likely some modifications **/ static GnmStyle * format_template_filter_style (GnmFT *ft, GnmStyle *mstyle, gboolean fill_defaults) { g_return_val_if_fail (ft != NULL, NULL); g_return_val_if_fail (mstyle != NULL, NULL); /* * Don't fill with defaults, this is perfect for when the * mstyles are going to be 'merged' with other mstyles which * have all their elements set */ if (!fill_defaults) { if (!ft->number) { gnm_style_unset_element (mstyle, MSTYLE_FORMAT); } if (!ft->border) { gnm_style_unset_element (mstyle, MSTYLE_BORDER_TOP); gnm_style_unset_element (mstyle, MSTYLE_BORDER_BOTTOM); gnm_style_unset_element (mstyle, MSTYLE_BORDER_LEFT); gnm_style_unset_element (mstyle, MSTYLE_BORDER_RIGHT); gnm_style_unset_element (mstyle, MSTYLE_BORDER_DIAGONAL); gnm_style_unset_element (mstyle, MSTYLE_BORDER_REV_DIAGONAL); } if (!ft->font) { gnm_style_unset_element (mstyle, MSTYLE_FONT_NAME); gnm_style_unset_element (mstyle, MSTYLE_FONT_BOLD); gnm_style_unset_element (mstyle, MSTYLE_FONT_ITALIC); gnm_style_unset_element (mstyle, MSTYLE_FONT_UNDERLINE); gnm_style_unset_element (mstyle, MSTYLE_FONT_STRIKETHROUGH); gnm_style_unset_element (mstyle, MSTYLE_FONT_SIZE); gnm_style_unset_element (mstyle, MSTYLE_FONT_COLOR); } if (!ft->patterns) { gnm_style_unset_element (mstyle, MSTYLE_COLOR_BACK); gnm_style_unset_element (mstyle, MSTYLE_COLOR_PATTERN); gnm_style_unset_element (mstyle, MSTYLE_PATTERN); } if (!ft->alignment) { gnm_style_unset_element (mstyle, MSTYLE_ALIGN_V); gnm_style_unset_element (mstyle, MSTYLE_ALIGN_H); } } else { GnmStyle *gnm_style_default = gnm_style_new_default (); /* * We fill in the gaps with the default mstyle */ if (!ft->number) { gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_FORMAT); } if (!ft->border) { gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_BORDER_TOP); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_BORDER_BOTTOM); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_BORDER_LEFT); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_BORDER_RIGHT); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_BORDER_DIAGONAL); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_BORDER_REV_DIAGONAL); } if (!ft->font) { gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_FONT_NAME); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_FONT_BOLD); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_FONT_ITALIC); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_FONT_UNDERLINE); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_FONT_STRIKETHROUGH); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_FONT_SIZE); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_FONT_COLOR); } if (!ft->patterns) { gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_COLOR_BACK); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_COLOR_PATTERN); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_PATTERN); } if (!ft->alignment) { gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_ALIGN_V); gnm_style_merge_element (mstyle, gnm_style_default, MSTYLE_ALIGN_H); } gnm_style_unref (gnm_style_default); } return mstyle; }