1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 #include "output/text-item.h"
24 #include "libpspp/cast.h"
25 #include "libpspp/pool.h"
26 #include "output/driver.h"
27 #include "output/output-item-provider.h"
28 #include "output/pivot-table.h"
29 #include "output/table.h"
30 #include "output/table-item.h"
31 #include "output/table-provider.h"
33 #include "gl/xalloc.h"
34 #include "gl/xvasprintf.h"
37 #define _(msgid) gettext (msgid)
38 #define N_(msgid) msgid
41 text_item_type_to_string (enum text_item_type type)
45 case TEXT_ITEM_PAGE_TITLE:
46 return _("Page Title");
51 case TEXT_ITEM_SYNTAX:
60 /* Creates and returns a new text item containing TEXT and the specified TYPE
61 and LABEL. The new text item takes ownership of TEXT and LABEL. If LABEL
62 is NULL, uses the default label for TYPE. */
64 text_item_create_nocopy (enum text_item_type type, char *text, char *label)
66 struct text_item *item = xzalloc (sizeof *item);
67 *item = (struct text_item) {
68 .output_item = OUTPUT_ITEM_INITIALIZER (&text_item_class),
69 .output_item.label = label,
72 .style = FONT_STYLE_INITIALIZER,
75 if (type == TEXT_ITEM_SYNTAX || type == TEXT_ITEM_LOG)
77 free (item->style.typeface);
78 item->style.typeface = xstrdup ("Monospaced");
84 /* Creates and returns a new text item containing a copy of TEXT and the
85 specified TYPE and LABEL. The caller retains ownership of TEXT and LABEL.
86 If LABEL is null, uses a default label for TYPE. */
88 text_item_create (enum text_item_type type, const char *text,
91 return text_item_create_nocopy (type, xstrdup (text),
92 label ? xstrdup (label) : NULL);
95 /* Returns ITEM's type. */
97 text_item_get_type (const struct text_item *item)
102 /* Returns ITEM's text, which the caller may not modify or free. */
104 text_item_get_text (const struct text_item *item)
109 /* Submits ITEM to the configured output drivers, and transfers ownership to
110 the output subsystem. */
112 text_item_submit (struct text_item *item)
114 output_submit (&item->output_item);
118 text_item_unshare (struct text_item *old)
120 assert (old->output_item.ref_cnt > 0);
121 if (!text_item_is_shared (old))
123 text_item_unref (old);
125 struct text_item *new = xmalloc (sizeof *new);
126 *new = (struct text_item) {
127 .output_item = OUTPUT_ITEM_CLONE_INITIALIZER (&old->output_item),
128 .text = xstrdup (old->text),
131 font_style_copy (NULL, &new->style, &old->style);
135 /* Attempts to append the text in SRC to DST. If successful, returns true,
138 Only TEXT_ITEM_SYNTAX and TEXT_ITEM_LOG items can be combined, and not with
141 DST must not be shared. */
143 text_item_append (struct text_item *dst, const struct text_item *src)
145 assert (!text_item_is_shared (dst));
146 if (dst->type != src->type
147 || (dst->type != TEXT_ITEM_SYNTAX && dst->type != TEXT_ITEM_LOG)
148 || strcmp (output_item_get_label (&dst->output_item),
149 output_item_get_label (&src->output_item))
150 || !font_style_equal (&dst->style, &src->style)
151 || dst->style.markup)
155 char *new_text = xasprintf ("%s\n%s", dst->text, src->text);
157 dst->text = new_text;
162 static const struct pivot_table_look *
163 text_item_table_look (void)
165 static struct pivot_table_look *look;
168 look = pivot_table_look_new_builtin_default ();
170 for (int a = 0; a < PIVOT_N_AREAS; a++)
171 memset (look->areas[a].cell_style.margin, 0,
172 sizeof look->areas[a].cell_style.margin);
173 for (int b = 0; b < PIVOT_N_BORDERS; b++)
174 look->borders[b].stroke = TABLE_STROKE_NONE;
180 text_item_to_table_item (struct text_item *text_item)
182 struct pivot_table *table = pivot_table_create__ (NULL, "Text");
183 pivot_table_set_look (table, text_item_table_look ());
185 struct pivot_dimension *d = pivot_dimension_create (
186 table, PIVOT_AXIS_ROW, N_("Text"));
187 d->hide_all_labels = true;
188 pivot_category_create_leaf (d->root, pivot_value_new_text ("null"));
190 struct pivot_value *content = pivot_value_new_user_text (
191 text_item->text, SIZE_MAX);
192 pivot_value_set_font_style (content, &text_item->style);
193 pivot_table_put1 (table, 0, content);
195 return table_item_create (table);
199 text_item_get_label (const struct output_item *output_item)
201 const struct text_item *item = to_text_item (output_item);
202 return text_item_type_to_string (item->type);
206 text_item_destroy (struct output_item *output_item)
208 struct text_item *item = to_text_item (output_item);
210 font_style_uninit (&item->style);
214 const struct output_item_class text_item_class =