#include "libpspp/pool.h"
#include "output/driver.h"
#include "output/output-item-provider.h"
+#include "output/pivot-table.h"
#include "output/table.h"
#include "output/table-item.h"
#include "output/table-provider.h"
struct text_item *
text_item_create_nocopy (enum text_item_type type, char *text, char *label)
{
- 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,
- };
- return item;
+ return text_item_create_value (type, pivot_value_new_user_text_nocopy (text),
+ label);
}
/* Creates and returns a new text item containing a copy of TEXT and the
const char *label)
{
return text_item_create_nocopy (type, xstrdup (text),
- label ? xstrdup (label) : NULL);
+ xstrdup_if_nonnull (label));
+}
+
+/* Creates and returns a new text item containing VALUE, TYPE, and LABEL.
+ Takes ownership of VALUE and LABEL. If LABEL is null, uses a default label
+ for TYPE. */
+struct text_item *
+text_item_create_value (enum text_item_type type, struct pivot_value *value,
+ char *label)
+{
+ if (type == TEXT_ITEM_SYNTAX || type == TEXT_ITEM_LOG)
+ {
+ if (!value->font_style)
+ {
+ value->font_style = xmalloc (sizeof *value->font_style);
+ *value->font_style = (struct font_style) FONT_STYLE_INITIALIZER;
+ }
+
+ free (value->font_style->typeface);
+ value->font_style->typeface = xstrdup ("Monospaced");
+ }
+
+ struct text_item *item = xzalloc (sizeof *item);
+ *item = (struct text_item) {
+ .output_item = OUTPUT_ITEM_INITIALIZER (&text_item_class),
+ .output_item.label = label,
+ .type = type,
+ .text = value,
+ };
+ return item;
}
/* Returns ITEM's type. */
return item->type;
}
-/* Returns ITEM's text, which the caller may not modify or free. */
-const char *
-text_item_get_text (const struct text_item *item)
+/* Returns ITEM's text, which the caller must eventually free. */
+char *
+text_item_get_plain_text (const struct text_item *item)
{
- return item->text;
+ return pivot_value_to_string_defaults (item->text);
}
/* Submits ITEM to the configured output drivers, and transfers ownership to
struct text_item *new = xmalloc (sizeof *new);
*new = (struct text_item) {
.output_item = OUTPUT_ITEM_CLONE_INITIALIZER (&old->output_item),
- .text = xstrdup (old->text),
+ .text = pivot_value_clone (old->text),
.type = old->type,
- .bold = old->bold,
- .italic = old->italic,
- .underline = old->underline,
- .markup = old->markup,
- .typeface = old->typeface ? xstrdup (old->typeface) : NULL,
- .size = old->size
};
return new;
}
+static bool
+nullable_font_style_equal (const struct font_style *a,
+ const struct font_style *b)
+{
+ return a && b ? font_style_equal (a, b) : !a && !b;
+}
+
/* Attempts to append the text in SRC to DST. If successful, returns true,
otherwise false.
|| (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))
- || dst->bold != src->bold
- || dst->italic != src->italic
- || dst->underline != src->underline
- || dst->markup
- || src->markup
- || strcmp (dst->typeface ? dst->typeface : "",
- src->typeface ? src->typeface : "")
- || dst->size != src->size)
+ || !nullable_font_style_equal (dst->text->font_style,
+ src->text->font_style)
+ || (dst->text->font_style && dst->text->font_style->markup)
+ || src->text->type != PIVOT_VALUE_TEXT
+ || dst->text->type != PIVOT_VALUE_TEXT)
return false;
else
{
- char *new_text = xasprintf ("%s\n%s", dst->text, src->text);
- free (dst->text);
- dst->text = new_text;
+ char *new_text = xasprintf ("%s\n%s", dst->text->text.local,
+ src->text->text.local);
+
+ free (dst->text->text.local);
+ if (dst->text->text.c != dst->text->text.local)
+ free (dst->text->text.c);
+ if (dst->text->text.id != dst->text->text.local
+ && dst->text->text.id != dst->text->text.c)
+ free (dst->text->text.id);
+
+ dst->text->text.local = new_text;
+ dst->text->text.c = new_text;
+ dst->text->text.id = 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 table *tab = table_create (1, 1, 0, 0, 0, 0);
-
- struct table_area_style *style = pool_alloc (tab->container, sizeof *style);
- *style = (struct table_area_style) { TABLE_AREA_STYLE_INITIALIZER__,
- .cell_style.halign = TABLE_HALIGN_LEFT };
- struct font_style *font_style = &style->font_style;
- if (text_item->typeface)
- font_style->typeface = pool_strdup (tab->container, text_item->typeface);
- font_style->size = text_item->size;
- font_style->bold = text_item->bold;
- font_style->italic = text_item->italic;
- font_style->underline = text_item->underline;
- font_style->markup = text_item->markup;
- tab->styles[0] = style;
-
- int opts = 0;
- if (text_item->markup)
- opts |= TAB_MARKUP;
- if (text_item->type == TEXT_ITEM_SYNTAX || text_item->type == TEXT_ITEM_LOG)
- opts |= TAB_FIX;
- table_text (tab, 0, 0, opts, text_item_get_text (text_item));
- struct table_item *table_item = table_item_create (tab);
+ 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"));
+
+ pivot_table_put1 (table, 0, pivot_value_clone (text_item->text));
+
text_item_unref (text_item);
- return table_item;
+
+ return table_item_create (table);
}
\f
static const char *
text_item_destroy (struct output_item *output_item)
{
struct text_item *item = to_text_item (output_item);
- free (item->text);
- free (item->typeface);
+ pivot_value_destroy (item->text);
free (item);
}