1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
4 * dialog-data-table.c: Create a Data Table
6 * Copyright (C) 2006-2007 Jody Goldberg (jody@gnome.org)
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) version 3.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
23 #include <gnumeric-config.h>
29 #include <selection.h>
31 #include <sheet-view.h>
33 #include <workbook-control.h>
36 #include <parse-util.h>
39 #include <widgets/gnumeric-expr-entry.h>
41 #include <glib/gi18n.h>
43 #define DIALOG_DATA_TABLE_KEY "dialog-data-table"
48 GnmExprEntry
*row_entry
, *col_entry
;
56 cb_data_table_destroy (GnmDialogDataTable
*state
)
58 if (state
->gui
!= NULL
)
59 g_object_unref (state
->gui
);
64 init_entry (GnmDialogDataTable
*state
, int row
)
66 GnmExprEntry
*gee
= gnm_expr_entry_new (state
->wbcg
, TRUE
);
67 GtkWidget
*grid
= go_gtk_builder_get_widget (state
->gui
, "table-grid");
69 g_return_val_if_fail (grid
!= NULL
, NULL
);
71 gnm_expr_entry_set_flags (gee
,
72 GNM_EE_SINGLE_RANGE
| GNM_EE_SHEET_OPTIONAL
| GNM_EE_FORCE_REL_REF
,
74 g_object_set (G_OBJECT (gee
), "with-icon", TRUE
, NULL
);
75 gtk_grid_attach (GTK_GRID (grid
), GTK_WIDGET (gee
), 1, row
, 1, 1);
80 cb_data_table_response (GtkWidget
*dialog
, gint response_id
, GnmDialogDataTable
*state
)
82 if (response_id
== GTK_RESPONSE_HELP
)
84 if (response_id
== GTK_RESPONSE_OK
)
85 cmd_create_data_table (GNM_WBC (state
->wbcg
),
86 state
->sheet
, &state
->input_range
,
87 gnm_expr_entry_get_text (state
->col_entry
),
88 gnm_expr_entry_get_text (state
->row_entry
));
89 gtk_widget_destroy (dialog
);
93 data_table_init (GnmDialogDataTable
*state
, WBCGtk
*wbcg
)
95 state
->gui
= gnm_gtk_builder_load ("res:ui/data-table.ui", NULL
, GO_CMD_CONTEXT (wbcg
));
96 if (state
->gui
== NULL
)
99 state
->dialog
= go_gtk_builder_get_widget (state
->gui
, "DataTable");
100 gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state
->dialog
),
102 GNM_DIALOG_DESTROY_CURRENT_SHEET_REMOVED
);
104 state
->row_entry
= init_entry (state
, 0);
105 state
->col_entry
= init_entry (state
, 1);
107 g_signal_connect (G_OBJECT (state
->dialog
), "response",
108 G_CALLBACK (cb_data_table_response
), state
);
109 gnm_init_help_button (
110 go_gtk_builder_get_widget (state
->gui
, "help"),
111 GNUMERIC_HELP_LINK_DATA_TABLE
);
113 /* a candidate for merging into attach guru */
114 gnm_keyed_dialog (state
->wbcg
, GTK_WINDOW (state
->dialog
),
115 DIALOG_DATA_TABLE_KEY
);
116 go_gtk_nonmodal_dialog (wbcg_toplevel (state
->wbcg
),
117 GTK_WINDOW (state
->dialog
));
119 wbc_gtk_attach_guru (state
->wbcg
, state
->dialog
);
120 g_object_set_data_full (G_OBJECT (state
->dialog
),
121 "state", state
, (GDestroyNotify
)cb_data_table_destroy
);
123 gtk_widget_show_all (GTK_WIDGET (state
->dialog
));
129 dialog_data_table (WBCGtk
*wbcg
)
131 GnmDialogDataTable
*state
;
133 GnmRange input_range
;
137 g_return_if_fail (wbcg
!= NULL
);
139 if (wbc_gtk_get_guru (wbcg
) ||
140 gnm_dialog_raise_if_exists (wbcg
, DIALOG_DATA_TABLE_KEY
))
143 sv
= wb_control_cur_sheet_view (GNM_WBC (wbcg
));
144 r
= selection_first_range (sv
, GO_CMD_CONTEXT (wbcg
), _("Create Data Table"));
147 if (range_width (r
) <= 1 || range_height (r
) <= 1) {
148 GError
*msg
= g_error_new (go_error_invalid(), 0,
149 _("The selection must have more than 1 column and row to create a Data Table."));
150 go_cmd_context_error (GO_CMD_CONTEXT (wbcg
), msg
);
155 input_range
.start
.col
++;
156 input_range
.start
.row
++;
157 sheet
= sv_sheet (sv
);
158 if (sheet_range_splits_region (sheet
, &input_range
, NULL
,
159 GO_CMD_CONTEXT (wbcg
), _("Data Table")))
161 if (cmd_cell_range_is_locked_effective
162 (sheet
, &input_range
, GNM_WBC (wbcg
),
167 state
= g_new0 (GnmDialogDataTable
, 1);
169 state
->sheet
= sheet
;
170 state
->input_range
= input_range
;
171 if (data_table_init (state
, wbcg
)) {
172 go_gtk_notice_dialog (wbcg_toplevel (wbcg
), GTK_MESSAGE_ERROR
,
173 _("Could not create the Data Table definition dialog."));