27bf5f47bca3c89cd4454fad1eb7ba0e38d5cac9
[pspp] / src / output / table-provider.h
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 1997, 1998, 1999, 2000, 2009, 2011, 2013, 2014, 2018 Free Software Foundation, Inc.
3
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.
8
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.
13
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/>. */
16
17 #ifndef OUTPUT_TABLE_PROVIDER
18 #define OUTPUT_TABLE_PROVIDER 1
19
20 #include <stdint.h>
21 #include "output/table.h"
22
23 struct pool;
24 struct string;
25
26 enum table_halign table_halign_interpret (enum table_halign, bool numeric);
27
28 struct footnote
29   {
30     size_t idx;
31     char *content;
32     char *marker;
33     struct area_style *style;
34   };
35
36 /* A cell in a table. */
37 struct table_cell
38   {
39     /* Occupied table region.
40
41        d[TABLE_HORZ][0] is the leftmost column.
42        d[TABLE_HORZ][1] is the rightmost column, plus 1.
43        d[TABLE_VERT][0] is the top row.
44        d[TABLE_VERT][1] is the bottom row, plus 1.
45
46        For an ordinary cell:
47            d[TABLE_HORZ][1] == d[TABLE_HORZ][0] + 1
48        and d[TABLE_VERT][1] == d[TABLE_VERT][0] + 1
49
50        For a joined cell:
51           d[TABLE_HORZ][1] > d[TABLE_HORZ][0] + 1
52        or d[TABLE_VERT][1] > d[TABLE_VERT][0] + 1
53        or both. */
54     int d[TABLE_N_AXES][2];
55
56     unsigned int options;       /* TAB_*. */
57     char *text;                 /* A paragraph of text. */
58
59     /* Optional footnote(s). */
60     const struct footnote **footnotes;
61     size_t n_footnotes;
62
63     const struct area_style *style;
64   };
65
66 void table_cell_format_footnote_markers (const struct table_cell *,
67                                          struct string *);
68
69 /* Returns the number of columns that CELL spans.  This is 1 for an ordinary
70    cell and greater than one for a cell that joins multiple columns. */
71 static inline int
72 table_cell_colspan (const struct table_cell *cell)
73 {
74   return cell->d[TABLE_HORZ][1] - cell->d[TABLE_HORZ][0];
75 }
76
77 /* Returns the number of rows that CELL spans.  This is 1 for an ordinary cell
78    and greater than one for a cell that joins multiple rows. */
79 static inline int
80 table_cell_rowspan (const struct table_cell *cell)
81 {
82   return cell->d[TABLE_VERT][1] - cell->d[TABLE_VERT][0];
83 }
84
85 /* Returns true if CELL is a joined cell, that is, if it spans multiple rows
86    or columns.  Otherwise, returns false. */
87 static inline bool
88 table_cell_is_joined (const struct table_cell *cell)
89 {
90   return table_cell_colspan (cell) > 1 || table_cell_rowspan (cell) > 1;
91 }
92 \f
93 /* Declarations to allow defining table classes. */
94
95 struct table_class
96   {
97     /* Frees TABLE.
98
99        The table class may assume that any cells that were retrieved by calling
100        the 'get_cell' function have been freed (by calling their destructors)
101        before this function is called. */
102     void (*destroy) (struct table *table);
103
104     /* Initializes CELL with the contents of the table cell at column X and row
105        Y within TABLE.  All members of CELL must be initialized, except that if
106        'destructor' is set to a null pointer, then 'destructor_aux' need not be
107        initialized.  The 'contents' member of CELL must be set to a nonnull
108        value.
109
110        The table class must allow any number of cells in the table to be
111        retrieved simultaneously; that is, TABLE must not assume that a given
112        cell will be freed before another one is retrieved using 'get_cell'.
113
114        The table class must allow joined cells to be retrieved, with identical
115        contents, using any (X,Y) location inside the cell.
116
117        The table class must not allow cells to overlap.
118
119        The table class should not allow a joined cell to cross the border
120        between header rows/columns and the interior of the table.  That is, a
121        joined cell should be entirely within headers rows and columns or
122        entirely outside them.
123
124        The table class may assume that CELL will be freed before TABLE is
125        destroyed. */
126     void (*get_cell) (const struct table *table, int x, int y,
127                       struct table_cell *cell);
128
129     /* Returns one of the TAL_* enumeration constants (declared in
130        output/table.h) representing a rule running alongside one of the cells
131        in TABLE.
132
133        See table_get_rule() in table.c for a detailed explanation of the
134        meaning of AXIS and X and Y, including a diagram. */
135     int (*get_rule) (const struct table *table,
136                      enum table_axis axis, int x, int y,
137                      struct cell_color *color);
138   };
139
140 void table_init (struct table *, const struct table_class *, int nc, int nr);
141 \f
142 /* For use primarily by output drivers. */
143
144 void table_get_cell (const struct table *, int x, int y, struct table_cell *);
145 int table_get_rule (const struct table *, enum table_axis, int x, int y,
146                     struct cell_color *);
147 size_t table_collect_footnotes (const struct table_item *,
148                                 const struct footnote ***);
149
150 #endif /* output/table-provider.h */