X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Ftable-item.c;h=b52bb8ce56655c287ea3967c915f4e55fb1e0477;hb=ab6a6170a426bbae24d65f7aedaa0c38913ca44c;hp=1b17c320a6e8e5a119c5ac1ff70a79089dcd83c6;hpb=26bad54c73bdb354262a2434de93e632a286b0d3;p=pspp diff --git a/src/output/table-item.c b/src/output/table-item.c index 1b17c320a6..b52bb8ce56 100644 --- a/src/output/table-item.c +++ b/src/output/table-item.c @@ -26,213 +26,28 @@ #include "output/output-item-provider.h" #include "output/pivot-table.h" #include "output/table-item.h" +#include "output/table-provider.h" #include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) -struct table_item_text * -table_item_text_create (const char *content) -{ - if (!content) - return NULL; - - struct table_item_text *text = xmalloc (sizeof *text); - *text = (struct table_item_text) { .content = xstrdup (content) }; - return text; -} - -struct table_item_text * -table_item_text_clone (const struct table_item_text *old) -{ - if (!old) - return NULL; - - struct table_item_text *new = xmalloc (sizeof *new); - *new = (struct table_item_text) { - .content = xstrdup (old->content), - .footnotes = xmemdup (old->footnotes, - old->n_footnotes * sizeof *old->footnotes), - .n_footnotes = old->n_footnotes, - .style = table_area_style_clone (NULL, old->style), - }; - return new; -} - -void -table_item_text_destroy (struct table_item_text *text) -{ - if (text) - { - free (text->content); - free (text->footnotes); - table_area_style_free (text->style); - free (text); - } -} - -void -table_item_layer_copy (struct table_item_layer *dst, - const struct table_item_layer *src) -{ - dst->content = xstrdup (src->content); - dst->footnotes = xmemdup (src->footnotes, - src->n_footnotes * sizeof *src->footnotes); - dst->n_footnotes = src->n_footnotes; -} - -void -table_item_layer_uninit (struct table_item_layer *layer) -{ - if (layer) - { - free (layer->content); - free (layer->footnotes); - } -} - -struct table_item_layers * -table_item_layers_clone (const struct table_item_layers *old) -{ - if (!old) - return NULL; - - struct table_item_layers *new = xmalloc (sizeof *new); - *new = (struct table_item_layers) { - .layers = xnmalloc (old->n_layers, sizeof *new->layers), - .n_layers = old->n_layers, - .style = table_area_style_clone (NULL, old->style), - }; - for (size_t i = 0; i < new->n_layers; i++) - table_item_layer_copy (&new->layers[i], &old->layers[i]); - return new; -} - -void -table_item_layers_destroy (struct table_item_layers *layers) -{ - if (layers) - { - for (size_t i = 0; i < layers->n_layers; i++) - table_item_layer_uninit (&layers->layers[i]); - free (layers->layers); - table_area_style_free (layers->style); - free (layers); - } -} - -/* Initializes ITEM as a table item for rendering TABLE. The new table item - initially has the specified TITLE, CAPTION, and NOTES, which may each be - NULL. The caller retains ownership of TITLE, CAPTION, and NOTES. */ +/* Initializes ITEM as a table item for rendering PT. Takes ownership of + PT. */ struct table_item * -table_item_create (struct table *table, const char *title, const char *caption, - const char *notes) +table_item_create (struct pivot_table *pt) { + pivot_table_assign_label_depth (pt); + struct table_item *item = xmalloc (sizeof *item); *item = (struct table_item) { .output_item = OUTPUT_ITEM_INITIALIZER (&table_item_class), - .table = table, - .title = table_item_text_create (title), - .caption = table_item_text_create (caption), - .notes = notes ? xstrdup (notes) : NULL, + .pt = pivot_table_unshare (pt), }; return item; } -/* Returns the table contained by TABLE_ITEM. The caller must not modify or - unref the returned table. */ -const struct table * -table_item_get_table (const struct table_item *table_item) -{ - return table_item->table; -} - -/* Returns ITEM's title, which is a null pointer if no title has been - set. */ -const struct table_item_text * -table_item_get_title (const struct table_item *item) -{ - return item->title; -} - -/* Sets ITEM's title to TITLE, replacing any previous title. Specify NULL for - TITLE to clear any title from ITEM. The caller retains ownership of TITLE. - - This function may only be used on a table_item that is unshared. */ -void -table_item_set_title (struct table_item *item, - const struct table_item_text *title) -{ - assert (!table_item_is_shared (item)); - table_item_text_destroy (item->title); - item->title = table_item_text_clone (title); -} - -/* Returns ITEM's layers, which will be a null pointer if no layers have been - set. */ -const struct table_item_layers * -table_item_get_layers (const struct table_item *item) -{ - return item->layers; -} - -/* Sets ITEM's layers to LAYERS, replacing any previous layers. Specify NULL - for LAYERS to clear any layers from ITEM. The caller retains ownership of - LAYERS. - - This function may only be used on a table_item that is unshared. */ -void -table_item_set_layers (struct table_item *item, - const struct table_item_layers *layers) -{ - assert (!table_item_is_shared (item)); - table_item_layers_destroy (item->layers); - item->layers = table_item_layers_clone (layers); -} - -/* Returns ITEM's caption, which is a null pointer if no caption has been - set. */ -const struct table_item_text * -table_item_get_caption (const struct table_item *item) -{ - return item->caption; -} - -/* Sets ITEM's caption to CAPTION, replacing any previous caption. Specify - NULL for CAPTION to clear any caption from ITEM. The caller retains - ownership of CAPTION. - - This function may only be used on a table_item that is unshared. */ -void -table_item_set_caption (struct table_item *item, - const struct table_item_text *caption) -{ - assert (!table_item_is_shared (item)); - table_item_text_destroy (item->caption); - item->caption = table_item_text_clone (caption); -} - -/* Returns ITEM's notes, which is a null pointer if ITEM has no notes. */ -const char * -table_item_get_notes (const struct table_item *item) -{ - return item->notes; -} - -/* Sets ITEM's notes to NOTES, replacing any previous notes. Specify NULL for - NOTES to clear any notes from ITEM. The caller retains ownership of - NOTES. - - This function may only be used on a table_item that is unshared.*/ -void -table_item_set_notes (struct table_item *item, const char *notes) -{ - assert (!table_item_is_shared (item)); - free (item->notes); - item->notes = notes ? xstrdup (notes) : NULL; -} - /* Submits TABLE_ITEM to the configured output drivers, and transfers ownership to the output subsystem. */ void @@ -244,22 +59,24 @@ table_item_submit (struct table_item *table_item) static const char * table_item_get_label (const struct output_item *output_item) { - const struct table_item *item = to_table_item (output_item); - return (item->title && item->title->content - ? item->title->content - : _("Table")); + struct table_item *item = to_table_item (output_item); + + if (!item->cached_label) + { + if (!item->pt->title) + return _("Table"); + + item->cached_label = pivot_value_to_string (item->pt->title, item->pt); + } + return item->cached_label; } static void table_item_destroy (struct output_item *output_item) { struct table_item *item = to_table_item (output_item); - table_item_text_destroy (item->title); - table_item_text_destroy (item->caption); - table_item_layers_destroy (item->layers); - free (item->notes); pivot_table_unref (item->pt); - table_unref (item->table); + free (item->cached_label); free (item); }