table-item: Remove barely used parameters from table_item_create().
[pspp] / src / output / text-item.c
index 5b18e54c5d4618c693865fb5e9d624accc8ef852..2f0cef5ee7f6cbfb7cc8989a50b66ccf4b9bcfe4 100644 (file)
@@ -18,7 +18,6 @@
 
 #include "output/text-item.h"
 
-#include <assert.h>
 #include <stdarg.h>
 #include <stdlib.h>
 
@@ -26,7 +25,7 @@
 #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
 
-/* 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");
+
+    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 TEXT and the
-   specified TYPE.  The caller retains 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 (enum text_item_type type, const char *text)
+text_item_create_nocopy (enum text_item_type type, char *text, char *label)
 {
-  return text_item_create_nocopy (type, xstrdup (text));
+  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;
 }
 
-/* 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 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_format (enum text_item_type type, const char *format, ...)
+text_item_create (enum text_item_type type, const char *text,
+                  const char *label)
 {
-  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. */
@@ -94,32 +105,98 @@ 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,
+    .bold = old->bold,
+    .italic = old->italic,
+    .underline = old->underline,
+    .markup = old->markup,
+    .typeface = old->typeface ? xstrdup (old->typeface) : NULL,
+    .size = old->size
+  };
+  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))
+      || 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)
+    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 table *tab = table_create (1, 1, 0, 0, 0, 0);
 
-  struct cell_style *style = pool_alloc (tab->container, sizeof *style);
-  *style = (struct cell_style) CELL_STYLE_INITIALIZER;
+  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)
-    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;
+    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 = TAB_LEFT;
+  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;
-  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)
 {
@@ -131,5 +208,6 @@ text_item_destroy (struct output_item *output_item)
 
 const struct output_item_class text_item_class =
   {
+    text_item_get_label,
     text_item_destroy,
   };