37
37
#include "sheet-style.h"
38
38
#include "workbook.h"
39
#include "workbook-view.h"
39
40
#include "workbook-control.h"
40
41
#include "command-context.h"
41
42
#include "gnm-format.h"
42
43
#include "sheet-object-cell-comment.h"
43
44
#include "style-color.h"
44
46
#include <goffice/app/go-doc.h>
47
#include <goffice/utils/go-glib-extras.h>
47
50
#include <glib/gi18n-lib.h>
62
65
dao_init (data_analysis_output_t *dao,
63
66
data_analysis_output_type_t type)
66
69
dao = g_new (data_analysis_output_t, 1);
70
dao->use_gfree = TRUE;
72
dao->use_gfree = FALSE;
69
75
dao->start_col = 0;
70
76
dao->start_row = 0;
71
77
dao->offset_col = 0;
72
78
dao->offset_row = 0;
73
dao->cols = gnm_sheet_get_max_cols (NULL);
74
dao->rows = gnm_sheet_get_max_rows (NULL);
79
dao->cols = 1; /* Fixed in dao_prepare_output */
76
82
dao->autofit_flag = TRUE;
77
83
dao->clear_outputrange = TRUE;
78
84
dao->retain_format = FALSE;
79
85
dao->retain_comments = FALSE;
80
86
dao->put_formulas = FALSE;
85
93
data_analysis_output_t *
94
dao_init_new_sheet (data_analysis_output_t *dao)
96
return dao_init (dao, NewSheetOutput);
99
void dao_free (data_analysis_output_t *dao)
101
go_slist_free_custom (dao->sos, g_object_unref);
108
data_analysis_output_t *
86
109
dao_load_from_value (data_analysis_output_t *dao,
87
110
GnmValue *output_range)
215
238
if (dao->type == NewSheetOutput) {
239
Sheet *old_sheet = wb_control_cur_sheet (dao->wbc);
216
240
Workbook *wb = wb_control_get_workbook (dao->wbc);
217
241
char *name_with_counter = g_strdup_printf ("%s (1)", name);
218
242
unique_name = workbook_sheet_get_free_name
219
243
(wb, name_with_counter, FALSE, TRUE);
220
244
g_free (name_with_counter);
221
dao->sheet = sheet_new (wb, unique_name);
245
dao->rows = gnm_sheet_get_max_rows (old_sheet);
246
dao->cols = gnm_sheet_get_max_cols (old_sheet);
247
dao->sheet = sheet_new (wb, unique_name, dao->cols, dao->rows);
222
248
g_free (unique_name);
223
249
dao->start_col = dao->start_row = 0;
224
dao->rows = gnm_sheet_get_max_rows (dao->sheet);
225
dao->cols = gnm_sheet_get_max_cols (dao->sheet);
226
250
workbook_sheet_attach (wb, dao->sheet);
227
251
} else if (dao->type == NewWorkbookOutput) {
252
Sheet *old_sheet = wb_control_cur_sheet (dao->wbc);
228
253
Workbook *wb = workbook_new ();
229
dao->sheet = sheet_new (wb, name);
254
dao->rows = gnm_sheet_get_max_rows (old_sheet);
255
dao->cols = gnm_sheet_get_max_cols (old_sheet);
256
dao->sheet = sheet_new (wb, name, dao->cols, dao->rows);
230
257
dao->start_col = dao->start_row = 0;
231
dao->rows = gnm_sheet_get_max_rows (dao->sheet);
232
dao->cols = gnm_sheet_get_max_cols (dao->sheet);
233
258
workbook_sheet_attach (wb, dao->sheet);
234
259
dao->wbc = wb_control_wrapper_new (dao->wbc, NULL, wb, NULL);
261
wb_view_sheet_focus (wb_control_view (dao->wbc), dao->sheet);
236
263
if (dao->rows == 0 || (dao->rows == 1 && dao->cols == 1))
237
264
dao->rows = gnm_sheet_get_max_rows (dao->sheet) - dao->start_row;
238
265
if (dao->cols == 0 || (dao->rows == 1 && dao->cols == 1))
334
dao_set_array_expr (data_analysis_output_t *dao,
335
int col, int row, int cols, int rows,
338
GnmExprTop const *texpr;
342
col += dao->offset_col;
343
row += dao->offset_row;
344
col_end = col + cols - 1;
345
row_end = row + rows - 1;
347
/* Check that the output is in the given range, but allow singletons
350
if (dao->type == RangeOutput && (dao->cols > 1 || dao->rows > 1)) {
351
if (col >= dao->cols || row >= dao->rows) {
352
gnm_expr_free (expr);
355
if (col_end >= dao->cols)
356
col_end = dao->cols - 1;
357
if (row_end >= dao->rows)
358
row_end = dao->rows - 1;
361
col += dao->start_col;
362
row += dao->start_row;
363
col_end += dao->start_col;
364
row_end += dao->start_row;
365
if (col >= gnm_sheet_get_max_cols (dao->sheet)
366
|| row >= gnm_sheet_get_max_rows (dao->sheet)) {
367
gnm_expr_free (expr);
370
if (col_end >= gnm_sheet_get_max_cols (dao->sheet))
371
col_end = gnm_sheet_get_last_col (dao->sheet);
372
if (row_end >= gnm_sheet_get_max_rows (dao->sheet))
373
row_end = gnm_sheet_get_last_row (dao->sheet);
375
texpr = gnm_expr_top_new (expr);
376
gnm_cell_set_array_formula (dao->sheet,
382
* dao_set_cell_array_expr absorbs the reference for the expr.
307
386
dao_set_cell_array_expr (data_analysis_output_t *dao, int col, int row,
308
387
GnmExpr const *expr)
310
GnmExprTop const *texpr;
312
col += dao->offset_col;
313
row += dao->offset_row;
315
/* Check that the output is in the given range, but allow singletons
318
if (dao->type == RangeOutput &&
319
(dao->cols > 1 || dao->rows > 1) &&
320
(col >= dao->cols || row >= dao->rows)) {
321
gnm_expr_free (expr);
325
col += dao->start_col;
326
row += dao->start_row;
327
if (col >= gnm_sheet_get_max_cols (dao->sheet) || row >= gnm_sheet_get_max_rows (dao->sheet)) {
328
gnm_expr_free (expr);
332
texpr = gnm_expr_top_new (expr);
333
gnm_cell_set_array_formula (dao->sheet,
389
dao_set_array_expr (dao, col, row, 1, 1, expr);
340
393
* dao_set_cell_expr absorbs the reference for the expr.
598
651
actual_col = dao->start_col + col;
600
653
ideal_size = sheet_col_size_fit_pixels (dao->sheet, actual_col,
601
0, gnm_sheet_get_max_rows (dao->sheet) - 1,
654
0, gnm_sheet_get_last_row (dao->sheet),
603
656
if (ideal_size == 0)
870
* set the given cell range to given format
875
dao_set_format (data_analysis_output_t *dao, int col1, int row1,
881
mstyle = gnm_style_new ();
882
gnm_style_set_format_text (mstyle, format);
883
dao_set_style (dao, col1, row1,
809
888
* dao_set_colors:
1055
1134
dao_convert_to_values (dao);
1056
1135
sheet_redraw_range (dao->sheet, &r);
1140
dao_get_cellref (data_analysis_output_t *dao, int x, int y)
1143
r.sheet = dao->sheet;
1144
r.col = x + dao->start_col + dao->offset_col;
1145
r.col_relative = FALSE;
1146
r.row = y + dao->start_row + dao->offset_row;
1147
r.row_relative = FALSE;
1148
return gnm_expr_new_cellref (&r);
1152
dao_get_rangeref (data_analysis_output_t *dao, int ax, int ay, int bx, int by)
1158
ar.sheet = dao->sheet;
1159
ar.col = ax + dao->start_col + dao->offset_col;
1160
ar.col_relative = FALSE;
1161
ar.row = ay + dao->start_row + dao->offset_row;
1162
ar.row_relative = FALSE;
1164
br.sheet = dao->sheet;
1165
br.col = bx + dao->start_col + dao->offset_col;
1166
br.col_relative = FALSE;
1167
br.row = by + dao->start_row + dao->offset_row;
1168
br.row_relative = FALSE;
1170
v = value_new_cellrange (&ar, &br, 0, 0);
1171
return gnm_expr_new_constant (v);
1176
dao_set_sheet_object (data_analysis_output_t *dao, int col, int row, SheetObject* so)
1178
SheetObjectAnchor anchor;
1181
g_return_if_fail (so != NULL);
1184
g_object_unref (so);
1188
range_init (&anchor_r, dao->start_col + col, dao->start_row + row,
1189
dao->start_col + ((dao->cols < 5) ? dao->cols : 5),
1190
dao->start_row + ((dao->rows < 20) ? dao->rows : 20));
1192
sheet_object_anchor_init (&anchor, &anchor_r, 0, GOD_ANCHOR_DIR_UNKNOWN);
1193
sheet_object_set_anchor (so, &anchor);
1194
sheet_object_set_sheet (so, dao->sheet);
1196
dao->sos = g_slist_prepend (dao->sos, so);
1200
dao_go_data_vector (data_analysis_output_t *dao, int ax, int ay, int bx, int by)
1202
return gnm_go_data_vector_new_expr (dao->sheet, gnm_expr_top_new (dao_get_rangeref (dao, ax, ay, bx, by)));
1206
dao_surrender_so (data_analysis_output_t *dao)
1208
GSList *l = dao->sos;
1215
dao_set_omit_so (data_analysis_output_t *dao, gboolean omit)
1217
dao->omit_so = omit;