output view: make items selectable and use system colours
[pspp] / src / output / pivot-table.h
index 44fa757bc63f7dda8daa9064ddc231971ebd8878..377579a013d356b3f5feb4cea5959381be201ae8 100644 (file)
@@ -107,6 +107,7 @@ enum pivot_area
   };
 
 const char *pivot_area_to_string (enum pivot_area);
+const struct area_style *pivot_area_get_default_style (enum pivot_area);
 
 /* Table borders for styling purposes. */
 enum pivot_border
@@ -145,6 +146,8 @@ enum pivot_border
   };
 
 const char *pivot_border_to_string (enum pivot_border);
+void pivot_border_get_default_style (enum pivot_border,
+                                     struct table_border_style *);
 
 /* Sizing for rows or columns of a rendered table.  The comments below talk
    about columns and their widths but they apply equally to rows and their
@@ -218,7 +221,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.
@@ -372,11 +375,17 @@ bool pivot_result_class_change (const char *, const struct fmt_spec *);
 /* 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;
+
     /* Display settings. */
     bool rotate_inner_column_labels;
     bool rotate_outer_row_labels;
     bool row_labels_in_corner;
     bool show_grid_lines;
+    bool show_caption;
     bool omit_empty;       /* Omit empty rows and columns? */
     size_t *current_layer; /* axis[PIVOT_AXIS_LAYER].n_dimensions elements. */
     char *table_look;
@@ -419,12 +428,12 @@ struct pivot_table
     time_t date;                /* May be 0 if unknown. */
 
     /* Footnotes. */
-    const struct pivot_footnote **footnotes;
+    struct pivot_footnote **footnotes;
     size_t n_footnotes, allocated_footnotes;
 
     /* 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;
@@ -445,10 +454,14 @@ 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 *);
 
 /* Format of PIVOT_RC_COUNT cells. */
 void pivot_table_set_weight_var (struct pivot_table *,
@@ -489,6 +502,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,7 +601,10 @@ struct pivot_value
   {
     struct font_style *font_style;
     struct cell_style *cell_style;
-    char *subscript;
+
+    char **subscripts;
+    size_t n_subscripts;
+
     char *superscript;
 
     const struct pivot_footnote **footnotes;
@@ -640,7 +657,8 @@ struct pivot_value
         /* PIVOT_VALUE_TEMPLATE. */
         struct
           {
-            char *s;
+            char *local;              /* Localized. */
+            char *id;                 /* Identifier. */
             struct pivot_argument *args;
             size_t n_args;
           }
@@ -694,7 +712,8 @@ void pivot_value_destroy (struct pivot_value *);
 
 /* Styling. */
 void pivot_value_get_style (struct pivot_value *,
-                            const struct area_style *default_style,
+                            const struct font_style *base_font_style,
+                            const struct cell_style *base_cell_style,
                             struct area_style *);
 void pivot_value_set_style (struct pivot_value *, const struct area_style *);
 
@@ -706,5 +725,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 */