#include "libpspp/pool.h"
#include "output/driver.h"
#include "output/output-item-provider.h"
-#include "output/tab.h"
+#include "output/table.h"
#include "output/table-item.h"
#include "output/table-provider.h"
#include "gettext.h"
#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
const char *
text_item_type_to_string (enum text_item_type type)
case TEXT_ITEM_LOG:
return _("Log");
- case TEXT_ITEM_EJECT_PAGE:
- return _("Page Break");
-
default:
return _("Text");
}
}
-/* Creates and returns a new text item containing TEXT and the specified TYPE.
- The new text item takes ownership of TEXT. */
+/* 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_nocopy (enum text_item_type type, char *text)
+text_item_create_nocopy (enum text_item_type type, char *text, char *label)
{
struct text_item *item = xzalloc (sizeof *item);
- output_item_init (&item->output_item, &text_item_class);
- item->text = text;
- item->type = type;
+ *item = (struct text_item) {
+ .output_item = OUTPUT_ITEM_INITIALIZER (&text_item_class),
+ .output_item.label = label,
+ .text = text,
+ .type = type,
+ .style = FONT_STYLE_INITIALIZER,
+ };
+
+ 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. The caller retains ownership of TEXT. */
+ 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)
+text_item_create (enum text_item_type type, const char *text,
+ const char *label)
{
- return text_item_create_nocopy (type, xstrdup (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. */
-struct text_item *
-text_item_create_format (enum text_item_type type, const char *format, ...)
-{
- struct text_item *item;
- va_list args;
-
- va_start (args, format);
- item = text_item_create_nocopy (type, xvasprintf (format, args));
- va_end (args);
-
- return item;
+ return text_item_create_nocopy (type, xstrdup (text),
+ label ? xstrdup (label) : NULL);
}
/* Returns ITEM's type. */
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;
+ }
+}
+
struct table_item *
text_item_to_table_item (struct text_item *text_item)
{
- struct tab_table *tab = tab_create (1, 1);
-
- struct area_style *style = pool_alloc (tab->container, sizeof *style);
- *style = (struct area_style) AREA_STYLE_INITIALIZER;
- 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;
+ 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) {
+ .cell_style = CELL_STYLE_INITIALIZER,
+ .cell_style.halign = TABLE_HALIGN_LEFT,
+ };
+ font_style_copy (tab->container, &style->font_style, &text_item->style);
tab->styles[0] = style;
- int opts = TAB_LEFT;
- if (text_item->markup)
+ int opts = 0;
+ if (text_item->style.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);
+ table_text (tab, 0, 0, opts, text_item_get_text (text_item));
+ struct table_item *table_item = table_item_create (tab);
text_item_unref (text_item);
return table_item;
}
\f
+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",
+ text_item_get_label,
text_item_destroy,
};