Add --table-look command line option and SET TLOOK command.
[pspp] / src / output / pivot-table.h
index c7198a2add47f7a7465f3540f3497afa15616230..c613e55efc81d557c03d67b28f45ce72f23c31da 100644 (file)
@@ -151,9 +151,6 @@ const char *pivot_border_to_string (enum pivot_border);
    heights. */
 struct pivot_table_sizing
   {
-    /* Minimum and maximum column width, in 1/96" units. */
-    int range[2];
-
     /* Specific column widths, in 1/96" units. */
     int *widths;
     size_t n_widths;
@@ -218,7 +215,7 @@ struct pivot_axis
    breaks out of the loop prematurely, it needs to free it with free(). */
 #define PIVOT_AXIS_FOR_EACH(INDEXES, AXIS)                              \
   for ((INDEXES) = NULL;                                                \
-       ((INDEXES) = pivot_axis_iterator_next (INDEXES, AXIS)) != NULL; )
+       ((INDEXES) = pivot_axis_iterator_next (INDEXES, AXIS)) != NULL;)
 size_t *pivot_axis_iterator_next (size_t *indexes, const struct pivot_axis *);
 \f
 /* Dimensions.
@@ -369,28 +366,32 @@ void pivot_category_destroy (struct pivot_category *);
 
 bool pivot_result_class_change (const char *, const struct fmt_spec *);
 \f
-/* A pivot table.  See the top of this file for more information. */
-struct pivot_table
+/* Styling for a pivot table.
+
+   The division between this and the style information in struct pivot_table
+   seems fairly arbitrary.  The ultimate reason for the division is simply
+   because that's how SPSS documentation and file formats do it. */
+struct pivot_table_look
   {
-    /* Display settings. */
-    bool rotate_inner_column_labels;
-    bool rotate_outer_row_labels;
+    /* Reference count.  A pivot_table_look may be shared between multiple
+       owners, indicated by a reference count greater than 1.  When this is the
+       case, the pivot_table must not be modified. */
+    int ref_cnt;
+
+    char *name;                 /* May be null. */
+
+    /* General properties. */
+    bool omit_empty;
     bool row_labels_in_corner;
-    bool show_grid_lines;
-    bool omit_empty;       /* Omit empty rows and columns? */
-    size_t *current_layer; /* axis[PIVOT_AXIS_LAYER]->n_dimensions elements. */
-    char *table_look;
-    enum settings_value_show show_values;
-    enum settings_value_show show_variables;
-    struct fmt_spec weight_format;
+    int width_ranges[TABLE_N_AXES][2];      /* In 1/96" units. */
 
     /* Footnote display settings. */
     bool show_numeric_markers;
     bool footnote_marker_superscripts;
 
-    /* Column and row sizing and page breaks.
-       sizing[TABLE_HORZ] is for columns, sizing[TABLE_VERT] is for rows. */
-    struct pivot_table_sizing sizing[TABLE_N_AXES];
+    /* Styles. */
+    struct table_area_style areas[PIVOT_N_AREAS];
+    struct table_border_style borders[PIVOT_N_BORDERS];
 
     /* Print settings. */
     bool print_all_layers;
@@ -399,6 +400,45 @@ struct pivot_table
     bool top_continuation, bottom_continuation;
     char *continuation;
     size_t n_orphan_lines;
+  };
+
+const struct pivot_table_look *pivot_table_look_get_default (void);
+void pivot_table_look_set_default (const struct pivot_table_look *);
+
+char *pivot_table_look_read (const char *, struct pivot_table_look **)
+  WARN_UNUSED_RESULT;
+
+const struct pivot_table_look *pivot_table_look_builtin_default (void);
+struct pivot_table_look *pivot_table_look_new_builtin_default (void);
+struct pivot_table_look *pivot_table_look_ref (
+  const struct pivot_table_look *);
+void pivot_table_look_unref (struct pivot_table_look *);
+struct pivot_table_look *pivot_table_look_unshare (struct pivot_table_look *);
+\f
+/* A pivot table.  See the top of this file for more information. */
+struct pivot_table
+  {
+    /* Reference count.  A pivot_table may be shared between multiple owners,
+       indicated by a reference count greater than 1.  When this is the case,
+       the pivot_table must not be modified. */
+    int ref_cnt;
+
+    /* Styling. */
+    struct pivot_table_look *look;
+
+    /* Display settings. */
+    bool rotate_inner_column_labels;
+    bool rotate_outer_row_labels;
+    bool show_grid_lines;
+    bool show_caption;
+    size_t *current_layer; /* axis[PIVOT_AXIS_LAYER].n_dimensions elements. */
+    enum settings_value_show show_values;
+    enum settings_value_show show_variables;
+    struct fmt_spec weight_format;
+
+    /* Column and row sizing and page breaks.
+       sizing[TABLE_HORZ] is for columns, sizing[TABLE_VERT] is for rows. */
+    struct pivot_table_sizing sizing[TABLE_N_AXES];
 
     /* Format settings. */
     int epoch;
@@ -424,15 +464,11 @@ struct pivot_table
 
     /* Titles. */
     struct pivot_value *title;
-    struct pivot_value *subtype;  /* Same as pivot_item's subtype. */
+    struct pivot_value *subtype;  /* Same as spv_item's subtype. */
     struct pivot_value *corner_text;
     struct pivot_value *caption;
     char *notes;
 
-    /* Styles. */
-    struct area_style areas[PIVOT_N_AREAS];
-    struct table_border_style borders[PIVOT_N_BORDERS];
-
     /* Dimensions. */
     struct pivot_dimension **dimensions;
     size_t n_dimensions;
@@ -445,10 +481,20 @@ struct pivot_table
 
 /* Creating and destroy pivot tables. */
 struct pivot_table *pivot_table_create (const char *title);
-struct pivot_table *pivot_table_create__ (struct pivot_value *title);
+struct pivot_table *pivot_table_create__ (struct pivot_value *title,
+                                          const char *subtype);
 struct pivot_table *pivot_table_create_for_text (struct pivot_value *title,
                                                  struct pivot_value *content);
-void pivot_table_destroy (struct pivot_table *);
+
+struct pivot_table *pivot_table_ref (const struct pivot_table *);
+void pivot_table_unref (struct pivot_table *);
+bool pivot_table_is_shared (const struct pivot_table *);
+
+/* Styling. */
+const struct pivot_table_look *pivot_table_get_look (
+  const struct pivot_table *);
+void pivot_table_set_look (struct pivot_table *,
+                           const struct pivot_table_look *);
 
 /* Format of PIVOT_RC_COUNT cells. */
 void pivot_table_set_weight_var (struct pivot_table *,
@@ -489,6 +535,7 @@ struct pivot_footnote
     size_t idx;
     struct pivot_value *content;
     struct pivot_value *marker;
+    bool show;
   };
 
 struct pivot_footnote *pivot_table_create_footnote (
@@ -587,10 +634,13 @@ struct pivot_value
   {
     struct font_style *font_style;
     struct cell_style *cell_style;
-    char *subscript;
+
+    char **subscripts;
+    size_t n_subscripts;
+
     char *superscript;
 
-    struct pivot_footnote **footnotes;
+    const struct pivot_footnote **footnotes;
     size_t n_footnotes;
 
     enum pivot_value_type type;
@@ -640,7 +690,8 @@ struct pivot_value
         /* PIVOT_VALUE_TEMPLATE. */
         struct
           {
-            char *s;
+            char *local;              /* Localized. */
+            char *id;                 /* Identifier. */
             struct pivot_argument *args;
             size_t n_args;
           }
@@ -665,16 +716,20 @@ struct pivot_value *pivot_value_new_variable (const struct variable *);
 /* Values from text strings. */
 struct pivot_value *pivot_value_new_text (const char *);
 struct pivot_value *pivot_value_new_text_format (const char *, ...)
-  PRINTF_FORMAT (1, 2);
+#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__>= 4) || __GNUC__ > 4)
+  __attribute__((format(gnu_printf, 1, 2)));
+#else
+  __attribute__((format(__printf__, 1, 2)));
+#endif
 
 struct pivot_value *pivot_value_new_user_text (const char *, size_t length);
 struct pivot_value *pivot_value_new_user_text_nocopy (char *);
 
 /* Footnotes. */
-void pivot_value_add_footnote (struct pivot_value *, struct pivot_footnote *);
+void pivot_value_add_footnote (struct pivot_value *, const struct pivot_footnote *);
 
 /* Numeric formats. */
-void pivot_value_set_rc (struct pivot_table *, struct pivot_value *,
+void pivot_value_set_rc (const struct pivot_table *, struct pivot_value *,
                          const char *rc);
 
 /* Converting a pivot_value to a string for display. */
@@ -694,9 +749,11 @@ void pivot_value_destroy (struct pivot_value *);
 
 /* Styling. */
 void pivot_value_get_style (struct pivot_value *,
-                            const struct area_style *default_style,
-                            struct area_style *);
-void pivot_value_set_style (struct pivot_value *, const struct area_style *);
+                            const struct font_style *base_font_style,
+                            const struct cell_style *base_cell_style,
+                            struct table_area_style *);
+void pivot_value_set_style (struct pivot_value *,
+                            const struct table_area_style *);
 
 /* Template arguments. */
 struct pivot_argument
@@ -706,5 +763,13 @@ struct pivot_argument
   };
 
 void pivot_argument_uninit (struct pivot_argument *);
+\f
+/* One piece of data within a pivot table. */
+struct pivot_cell
+  {
+    struct hmap_node hmap_node; /* In struct pivot_table's 'cells' hmap. */
+    struct pivot_value *value;
+    unsigned int idx[];         /* One index per table dimension. */
+  };
 
 #endif /* output/pivot-table.h */