This is a type of table (see output/table.h) whose content is composed
manually by the code that generates it, by filling in cells one by one.
-
- Some of the features of this type of table are obsolete but have not yet
- been removed, because some code still uses them. These features are:
-
- - The title and caption. These are properties of the table_item (see
- output/table-item.h) in which a table is embedded, not properties of
- the table itself.
-
- - Row and columns offsets (via tab_offset(), tab_next_row()). This
- feature simply isn't used enough to justify keeping it.
-
- - Table resizing. The code that does use this feature is just as well
- served by creating multiple tables and pasting them together with
- table_paste(). Eliminating this feature would also slightly simplify
- the table code here.
*/
#include "libpspp/compiler.h"
#include "output/table.h"
#include "data/format.h"
-enum result_class
+#define TAB_STYLE_MASK (7u << (TAB_FIRST_AVAILABLE + 1))
+#define TAB_STYLE_SHIFT (TAB_FIRST_AVAILABLE + 1)
+
+enum
{
- RC_INTEGER,
- RC_WEIGHT,
- RC_PVALUE,
- RC_OTHER,
- n_RC
+ /* Horizontal alignment of cell contents. */
+ TAB_RIGHT = 0 << (TAB_FIRST_AVAILABLE + 2),
+ TAB_LEFT = 1 << (TAB_FIRST_AVAILABLE + 2),
+ TAB_CENTER = 2 << (TAB_FIRST_AVAILABLE + 2),
+ TAB_HALIGN = 3 << (TAB_FIRST_AVAILABLE + 2), /* Alignment mask. */
+
+ /* Vertical alignment of cell contents. */
+ TAB_TOP = 0 << (TAB_FIRST_AVAILABLE + 4),
+ TAB_MIDDLE = 1 << (TAB_FIRST_AVAILABLE + 4),
+ TAB_BOTTOM = 2 << (TAB_FIRST_AVAILABLE + 4),
+ TAB_VALIGN = 3 << (TAB_FIRST_AVAILABLE + 4), /* Alignment mask. */
};
+/* Rule masks. */
+#define TAB_RULE_TYPE_MASK 7
+#define TAB_RULE_TYPE_SHIFT 0
+#define TAB_RULE_STYLE_MASK (31 << TAB_RULE_STYLE_SHIFT)
+#define TAB_RULE_STYLE_SHIFT 3
+
/* A table. */
struct tab_table
{
struct pool *container;
/* Table title and caption, or null. */
- char *title, *caption;
int cf; /* Column factor for indexing purposes. */
/* Table contents.
however, it is a joined cell and the corresponding element of cc[]
points to a struct tab_joined_cell. */
void **cc; /* Cell contents; void *[nr][nc]. */
- unsigned char *ct; /* Cell types; unsigned char[nr][nc]. */
+ unsigned short *ct; /* Cell types; unsigned short[nr][nc]. */
+ struct area_style *styles[8];
/* Rules. */
unsigned char *rh; /* Horiz rules; unsigned char[nr+1][nc]. */
unsigned char *rv; /* Vert rules; unsigned char[nr][nc+1]. */
-
- /* X and Y offsets. */
- int col_ofs, row_ofs;
-
- struct fmt_spec fmtmap [n_RC];
+ struct cell_color *rule_colors[32];
};
struct tab_table *tab_cast (const struct table *);
/* Tables. */
struct tab_table *tab_create (int nc, int nr);
-void tab_resize (struct tab_table *, int nc, int nr);
-void tab_realloc (struct tab_table *, int nc, int nr);
void tab_headers (struct tab_table *, int l, int r, int t, int b);
-void tab_title (struct tab_table *, const char *, ...)
- PRINTF_FORMAT (2, 3);
-void tab_caption (struct tab_table *, const char *, ...)
- PRINTF_FORMAT (2, 3);
-void tab_submit (struct tab_table *);
/* Rules. */
void tab_hline (struct tab_table *, int style, int x1, int x2, int y);
void tab_box (struct tab_table *, int f_h, int f_v, int i_h, int i_v,
int x1, int y1, int x2, int y2);
-/* Obsolete cell options. */
-#define TAT_TITLE TAB_EMPH /* Title attributes. */
-
-void tab_set_format (struct tab_table *, enum result_class, const struct fmt_spec *);
-
-
/* Cells. */
-struct fmt_spec;
-struct dictionary;
-union value;
-void tab_value (struct tab_table *, int c, int r, unsigned char opt,
- const union value *, const struct variable *,
- const struct fmt_spec *);
-
-void tab_double (struct tab_table *, int c, int r, unsigned char opt,
- double v, const struct fmt_spec *, enum result_class );
-
void tab_text (struct tab_table *, int c, int r, unsigned opt, const char *);
void tab_text_format (struct tab_table *, int c, int r, unsigned opt,
const char *, ...)
void tab_joint_text (struct tab_table *, int x1, int y1, int x2, int y2,
unsigned opt, const char *);
-void tab_joint_text_format (struct tab_table *, int x1, int y1, int x2, int y2,
- unsigned opt, const char *, ...)
- PRINTF_FORMAT (7, 8);
-void tab_footnote (struct tab_table *, int x, int y, const char *format, ...)
- PRINTF_FORMAT (4, 5);
+struct footnote *tab_create_footnote (struct tab_table *, size_t idx,
+ const char *content, const char *marker,
+ struct area_style *);
+void tab_add_footnote (struct tab_table *, int x, int y,
+ const struct footnote *);
-void tab_subtable (struct tab_table *, int x1, int y1, int x2, int y2,
- unsigned opt, struct table_item *subtable);
-void tab_subtable_bare (struct tab_table *, int x1, int y1, int x2, int y2,
- unsigned opt, struct table_item *subtable);
+void tab_add_style (struct tab_table *, int x, int y,
+ const struct area_style *);
bool tab_cell_is_empty (const struct tab_table *, int c, int r);
-/* Editing. */
-void tab_offset (struct tab_table *, int col, int row);
-void tab_next_row (struct tab_table *);
-
-/* Current row/column offset. */
-#define tab_row(TABLE) ((TABLE)->row_ofs)
-#define tab_col(TABLE) ((TABLE)->col_ofs)
-
/* Simple output. */
void tab_output_text (int options, const char *string);
void tab_output_text_format (int options, const char *, ...)