static gboolean sylk_rtd_f_parse (SylkReader *state, char *str) { GnmStyle *style = NULL; char *next; int tmp, size = -1; gboolean is_default_style = FALSE; int full_col = -1, full_row = -1; for (; *str != '\0' ; str = next) { next = sylk_next_token (str); switch (*str) { case 'D': /* Default sheet style ;D<fmt-id><digits><alignment><num_cols??> default Format. */ is_default_style = TRUE; case 'F': { /* Cell Format ;F<fmt-id><digits><alignment>: Single cell format. */ /* Format: D - default C - currency (extended) E - exponent F - fixed G - general, $ - dollar * - graph % - percent Alignment: DCGLR-X */ char ch1, alignment; if (3 == sscanf (str+1, "%c%d%c", &ch1, &tmp, &alignment)) { int a = -1; switch (alignment) { case 'S' : /* standard ? how does this differ from default */ case 'D' : a = GNM_HALIGN_GENERAL; break; case 'L' : a = GNM_HALIGN_LEFT; break; case 'R' : a = GNM_HALIGN_RIGHT; break; case 'C' : a = GNM_HALIGN_CENTER; break; case 'X' : a = GNM_HALIGN_FILL; break; default : break; } if (a >= 0) { if (style == NULL) style = gnm_style_new (); gnm_style_set_align_h (style, a); } } break; } /**************************************************/ /* Globals */ case 'E': state->pp.sheet->display_formulas = TRUE; break; case 'G': state->pp.sheet->hide_grid = TRUE; break; case 'H': state->pp.sheet->hide_col_header = TRUE; state->pp.sheet->hide_row_header = TRUE; break; case 'K': /* show commas ?? */ break; case 'Z': /* hide zeros */ state->pp.sheet->hide_zero = TRUE; break; /**************************************************/ case 'M' : /* row or col size * 20 or num cols for global */ sylk_parse_int (str+1, &size); break; case 'N' : { /* global font */ int size; if (2 == sscanf (str+1, "%d %d", &tmp, &size) && 1 <= tmp && tmp <= (int)state->fonts->len) { GnmStyle const *font = g_ptr_array_index (state->fonts, tmp-1); if (style == NULL) style = gnm_style_new (); is_default_style = TRUE; gnm_style_merge_element (style, font, MSTYLE_FONT_NAME); gnm_style_merge_element (style, font, MSTYLE_FONT_SIZE); /* It looks like the size from the id dominates * this size */ } break; } case 'P': if (sylk_parse_int (str+1, &tmp) && 0 <= tmp && tmp < (int)state->formats->len) { if (style == NULL) style = gnm_style_new (); gnm_style_set_format (style, g_ptr_array_index (state->formats, tmp)); } break; case 'S': for (str++ ; *str && *str != ';' ; str++) { switch (*str) { case 'I': if (style == NULL) style = gnm_style_new (); gnm_style_set_font_italic (style, TRUE); break; case 'D': if (style == NULL) style = gnm_style_new (); gnm_style_set_font_bold (style, TRUE); break; case 'M': if (sylk_parse_int (str+1, &tmp) && 1 <= tmp && tmp <= (int)state->fonts->len) { GnmStyle const *font = g_ptr_array_index (state->fonts, tmp-1); if (style == NULL) style = gnm_style_new (); gnm_style_merge_element (style, font, MSTYLE_FONT_NAME); gnm_style_merge_element (style, font, MSTYLE_FONT_SIZE); } str = (char *)" "; break; case 'S': /* seems to stipple things */ if (style == NULL) style = gnm_style_new (); gnm_style_set_pattern (style, 5); break; case 'T': style = sylk_set_border (style, MSTYLE_BORDER_TOP); break; case 'B': style = sylk_set_border (style, MSTYLE_BORDER_BOTTOM); break; case 'L': style = sylk_set_border (style, MSTYLE_BORDER_LEFT); break; case 'R': style = sylk_set_border (style, MSTYLE_BORDER_RIGHT); break; default: sylk_read_warning (state, "unhandled style S%c.", *str); } } break; case 'W': { int first, last, width; if (3 == sscanf (str+1, "%d %d %d", &first, &last, &width)) { /* width seems to be in characters */ if (first <= last && first < gnm_sheet_get_max_cols (state->pp.sheet) && last < gnm_sheet_get_max_cols (state->pp.sheet)) while (first <= last) sheet_col_set_size_pts (state->pp.sheet, first++ - 1, width*7.45, TRUE); } break; } case 'C': if (sylk_parse_int (str+1, &tmp)) full_col = tmp - 1; break; case 'R': if (sylk_parse_int (str+1, &tmp)) full_row = tmp - 1; break; case 'X': if (sylk_parse_int (str+1, &tmp)) state->pp.eval.col = tmp - 1; break; case 'Y': if (sylk_parse_int (str+1, &tmp)) state->pp.eval.row = tmp - 1; break; default: sylk_read_warning (state, "unhandled F option %c.", *str); } } if (full_col >= 0) { if (NULL != style) sheet_style_apply_col (state->pp.sheet, full_col, style); if (size > 0) sheet_col_set_size_pts (state->pp.sheet, full_col, size / 20.0, FALSE); } else if (full_row >= 0) { if (NULL != style) sheet_style_apply_row (state->pp.sheet, full_row, style); if (size > 0) sheet_row_set_size_pts (state->pp.sheet, full_row, size / 20.0, FALSE); } else if (NULL != style) { if (is_default_style) { GnmRange r; range_init_full_sheet (&r, state->pp.sheet); sheet_style_apply_range (state->pp.sheet, &r, style); } else sheet_style_apply_pos (state->pp.sheet, state->pp.eval.col, state->pp.eval.row, style); } return TRUE; }
/** * 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; }