1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 2009, 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/>. */
18 #define OUTPUT_ITEM_H 1
22 An output item is a self-contained chunk of output.
27 #include "libpspp/cast.h"
28 #include "libpspp/string-array.h"
36 OUTPUT_ITEM_PAGE_BREAK,
41 const char *output_item_type_to_string (enum output_item_type);
43 /* A single output item. */
46 /* Reference count. An output item may be shared between multiple owners,
47 indicated by a reference count greater than 1. When this is the case,
48 the output item must not be modified. */
51 /* The localized label for the item that appears in the outline pane in the
52 PSPPIRE output viewer and in PDF outlines. This is NULL if no label has
55 Use output_item_get_label() to read an item's label. */
58 /* A locale-invariant identifier for the command that produced the output,
59 which may be NULL if unknown or if a command did not produce this
63 /* For OUTPUT_ITEM_GROUP, this is true if the group's subtree should
64 be expanded in an outline view, false otherwise.
66 For other kinds of output items, this is true to show the item's
67 content, false to hide it. The item's label is always shown in an
71 /* Information about the SPV file this output_item was read from.
73 struct spv_info *spv_info;
75 enum output_item_type type;
80 cairo_surface_t *image;
84 struct output_item **children;
86 size_t allocated_children;
92 struct pivot_table *table;
96 enum text_item_subtype
98 TEXT_ITEM_PAGE_TITLE, /* TITLE and SUBTITLE commands. */
99 TEXT_ITEM_TITLE, /* Title. */
100 TEXT_ITEM_SYNTAX, /* Syntax printback logging. */
101 TEXT_ITEM_LOG, /* Other logging. */
104 struct pivot_value *content;
112 struct output_item *output_item_ref (const struct output_item *) WARN_UNUSED_RESULT;
113 void output_item_unref (struct output_item *);
114 bool output_item_is_shared (const struct output_item *);
115 struct output_item *output_item_unshare (struct output_item *);
117 void output_item_submit (struct output_item *);
118 void output_item_submit_children (struct output_item *);
120 const char *output_item_get_label (const struct output_item *);
121 void output_item_set_label (struct output_item *, const char *);
122 void output_item_set_label_nocopy (struct output_item *, char *);
124 void output_item_set_command_name (struct output_item *, const char *);
125 void output_item_set_command_name_nocopy (struct output_item *, char *);
127 char *output_item_get_subtype (const struct output_item *);
129 void output_item_add_spv_info (struct output_item *);
131 void output_item_dump (const struct output_item *, int indentation);
133 /* In-order traversal of a tree of output items. */
135 struct output_iterator_node
137 const struct output_item *group;
141 struct output_iterator
143 const struct output_item *cur;
144 struct output_iterator_node *nodes;
147 #define OUTPUT_ITERATOR_INIT(ITEM) { .cur = ITEM }
149 /* Iteration functions. */
150 void output_iterator_init (struct output_iterator *,
151 const struct output_item *);
152 void output_iterator_destroy (struct output_iterator *);
153 void output_iterator_next (struct output_iterator *);
155 /* Iteration helper macros. */
156 #define OUTPUT_ITEM_FOR_EACH(ITER, ROOT) \
157 for (output_iterator_init (ITER, ROOT); (ITER)->cur; \
158 output_iterator_next (ITER))
159 #define OUTPUT_ITEM_FOR_EACH_SKIP_ROOT(ITER, ROOT) \
160 for (output_iterator_init (ITER, ROOT), output_iterator_next (ITER); \
161 (ITER)->cur; output_iterator_next (ITER))
163 /* OUTPUT_ITEM_CHART. */
164 struct output_item *chart_item_create (struct chart *);
166 /* OUTPUT_ITEM_GROUP. */
167 struct output_item *group_item_create (const char *command_name,
169 struct output_item *group_item_create_nocopy (char *command_name, char *label);
171 void group_item_add_child (struct output_item *parent,
172 struct output_item *child);
174 struct output_item *root_item_create (void);
176 struct output_item *group_item_clone_empty (const struct output_item *);
178 /* OUTPUT_ITEM_IMAGE. */
180 struct output_item *image_item_create (cairo_surface_t *);
182 /* OUTPUT_ITEM_MESSAGE. */
184 struct output_item *message_item_create (const struct msg *);
186 const struct msg *message_item_get_msg (const struct output_item *);
188 struct output_item *message_item_to_text_item (struct output_item *);
190 /* OUTPUT_ITEM_PAGE_BREAK. */
192 struct output_item *page_break_item_create (void);
194 /* OUTPUT_ITEM_TABLE. */
196 struct output_item *table_item_create (struct pivot_table *);
198 /* OUTPUT_ITEM_TEXT. */
200 struct output_item *text_item_create (enum text_item_subtype,
201 const char *text, const char *label);
202 struct output_item *text_item_create_nocopy (enum text_item_subtype,
203 char *text, char *label);
204 struct output_item *text_item_create_value (enum text_item_subtype,
205 struct pivot_value *value,
208 enum text_item_subtype text_item_get_subtype (const struct output_item *);
209 char *text_item_get_plain_text (const struct output_item *);
211 bool text_item_append (struct output_item *dst, const struct output_item *src);
213 struct output_item *text_item_to_table_item (struct output_item *);
215 const char *text_item_subtype_to_string (enum text_item_subtype);
217 /* An informational node for output items that were read from an .spv file.
218 This is mostly for debugging and troubleshooting purposes with the
219 pspp-output program. */
223 struct zip_reader *zip_reader;
225 /* True if there was an error reading the output item (e.g. because of
226 corruption or because PSPP doesn't understand the format.) */
229 /* Zip member names. All may be NULL. */
230 char *structure_member;
236 void spv_info_destroy (struct spv_info *);
237 struct spv_info *spv_info_clone (const struct spv_info *);
238 size_t spv_info_get_members (const struct spv_info *, const char **members,
239 size_t allocated_members);
241 #endif /* output/output-item.h */