X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftext-item.c;h=49c9f225c06a21a6b95557ddf7ce7bc2a0caff96;hb=b0486442675e454c1e542a7098e5f127b2757787;hp=5b18e54c5d4618c693865fb5e9d624accc8ef852;hpb=e6bb779b866f297b736a7f93a0c8aa741131726f;p=pspp diff --git a/src/output/text-item.c b/src/output/text-item.c index 5b18e54c5d..49c9f225c0 100644 --- a/src/output/text-item.c +++ b/src/output/text-item.c @@ -18,7 +18,6 @@ #include "output/text-item.h" -#include #include #include @@ -26,7 +25,8 @@ #include "libpspp/pool.h" #include "output/driver.h" #include "output/output-item-provider.h" -#include "output/tab.h" +#include "output/pivot-table.h" +#include "output/table.h" #include "output/table-item.h" #include "output/table-provider.h" @@ -35,43 +35,63 @@ #include "gettext.h" #define _(msgid) gettext (msgid) +#define N_(msgid) msgid -/* Creates and returns a new text item containing TEXT and the specified TYPE. - The new text item takes ownership of TEXT. */ -struct text_item * -text_item_create_nocopy (enum text_item_type type, char *text) +const char * +text_item_type_to_string (enum text_item_type type) { - struct text_item *item = xzalloc (sizeof *item); - output_item_init (&item->output_item, &text_item_class); - item->text = text; - item->type = type; - return item; -} + switch (type) + { + case TEXT_ITEM_PAGE_TITLE: + return _("Page Title"); -/* Creates and returns a new text item containing a copy of TEXT and the - specified TYPE. The caller retains ownership of TEXT. */ -struct text_item * -text_item_create (enum text_item_type type, const char *text) -{ - return text_item_create_nocopy (type, xstrdup (text)); + case TEXT_ITEM_TITLE: + return _("Title"); + + case TEXT_ITEM_SYNTAX: + case TEXT_ITEM_LOG: + return _("Log"); + + default: + return _("Text"); + } } -/* Creates and returns a new text item containing a copy of FORMAT, which is - formatted as if by printf(), and the specified TYPE. The caller retains - ownership of FORMAT. */ +/* Creates and returns a new text item containing TEXT and the specified TYPE + and LABEL. The new text item takes ownership of TEXT and LABEL. If LABEL + is NULL, uses the default label for TYPE. */ struct text_item * -text_item_create_format (enum text_item_type type, const char *format, ...) +text_item_create_nocopy (enum text_item_type type, char *text, char *label) { - struct text_item *item; - va_list args; + struct text_item *item = xzalloc (sizeof *item); + *item = (struct text_item) { + .output_item = OUTPUT_ITEM_INITIALIZER (&text_item_class), + .output_item.label = label, + .text = text, + .type = type, + .style = FONT_STYLE_INITIALIZER, + }; - va_start (args, format); - item = text_item_create_nocopy (type, xvasprintf (format, args)); - va_end (args); + if (type == TEXT_ITEM_SYNTAX || type == TEXT_ITEM_LOG) + { + free (item->style.typeface); + item->style.typeface = xstrdup ("Monospaced"); + } return item; } +/* Creates and returns a new text item containing a copy of TEXT and the + specified TYPE and LABEL. The caller retains ownership of TEXT and LABEL. + If LABEL is null, uses a default label for TYPE. */ +struct text_item * +text_item_create (enum text_item_type type, const char *text, + const char *label) +{ + return text_item_create_nocopy (type, xstrdup (text), + label ? xstrdup (label) : NULL); +} + /* Returns ITEM's type. */ enum text_item_type text_item_get_type (const struct text_item *item) @@ -94,42 +114,105 @@ text_item_submit (struct text_item *item) output_submit (&item->output_item); } +struct text_item * +text_item_unshare (struct text_item *old) +{ + assert (old->output_item.ref_cnt > 0); + if (!text_item_is_shared (old)) + return old; + text_item_unref (old); + + struct text_item *new = xmalloc (sizeof *new); + *new = (struct text_item) { + .output_item = OUTPUT_ITEM_CLONE_INITIALIZER (&old->output_item), + .text = xstrdup (old->text), + .type = old->type, + }; + font_style_copy (NULL, &new->style, &old->style); + return new; +} + +/* Attempts to append the text in SRC to DST. If successful, returns true, + otherwise false. + + Only TEXT_ITEM_SYNTAX and TEXT_ITEM_LOG items can be combined, and not with + each other. + + DST must not be shared. */ +bool +text_item_append (struct text_item *dst, const struct text_item *src) +{ + assert (!text_item_is_shared (dst)); + if (dst->type != src->type + || (dst->type != TEXT_ITEM_SYNTAX && dst->type != TEXT_ITEM_LOG) + || strcmp (output_item_get_label (&dst->output_item), + output_item_get_label (&src->output_item)) + || !font_style_equal (&dst->style, &src->style) + || dst->style.markup) + return false; + else + { + char *new_text = xasprintf ("%s\n%s", dst->text, src->text); + free (dst->text); + dst->text = new_text; + return true; + } +} + +static const struct pivot_table_look * +text_item_table_look (void) +{ + static struct pivot_table_look *look; + if (!look) + { + look = pivot_table_look_new_builtin_default (); + + for (int a = 0; a < PIVOT_N_AREAS; a++) + memset (look->areas[a].cell_style.margin, 0, + sizeof look->areas[a].cell_style.margin); + for (int b = 0; b < PIVOT_N_BORDERS; b++) + look->borders[b].stroke = TABLE_STROKE_NONE; + } + return look; +} + struct table_item * text_item_to_table_item (struct text_item *text_item) { - struct tab_table *tab = tab_create (1, 1); - - struct cell_style *style = pool_alloc (tab->container, sizeof *style); - *style = (struct cell_style) CELL_STYLE_INITIALIZER; - if (text_item->typeface) - style->typeface = pool_strdup (tab->container, text_item->typeface); - style->size = text_item->size; - style->bold = text_item->bold; - style->italic = text_item->italic; - style->underline = text_item->underline; - tab->styles[0] = style; - - int opts = TAB_LEFT; - if (text_item->markup) - opts |= TAB_MARKUP; - if (text_item->type == TEXT_ITEM_SYNTAX || text_item->type == TEXT_ITEM_LOG) - opts |= TAB_FIX; - tab_text (tab, 0, 0, opts, text_item_get_text (text_item)); - struct table_item *table_item = table_item_create (&tab->table, NULL, NULL); - text_item_unref (text_item); - return table_item; + struct pivot_table *table = pivot_table_create__ (NULL, "Text"); + pivot_table_set_look (table, text_item_table_look ()); + + struct pivot_dimension *d = pivot_dimension_create ( + table, PIVOT_AXIS_ROW, N_("Text")); + d->hide_all_labels = true; + pivot_category_create_leaf (d->root, pivot_value_new_text ("null")); + + struct pivot_value *content = pivot_value_new_user_text ( + text_item->text, SIZE_MAX); + pivot_value_set_font_style (content, &text_item->style); + pivot_table_put1 (table, 0, content); + + return table_item_create (table); } +static const char * +text_item_get_label (const struct output_item *output_item) +{ + const struct text_item *item = to_text_item (output_item); + return text_item_type_to_string (item->type); +} + static void text_item_destroy (struct output_item *output_item) { struct text_item *item = to_text_item (output_item); free (item->text); - free (item->typeface); + font_style_uninit (&item->style); free (item); } const struct output_item_class text_item_class = { + text_item_get_label, text_item_destroy, };