GUI: Move .ui files from goffice resources to glib resources
[gnumeric.git] / src / dialogs / dialog-data-table.c
blob549d78ea7fee77a13471f342f238e1e1afe2fa83
1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 /*
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
21 * USA
23 #include <gnumeric-config.h>
24 #include <gnumeric.h>
25 #include "dialogs.h"
26 #include "help.h"
28 #include <expr.h>
29 #include <selection.h>
30 #include <sheet.h>
31 #include <sheet-view.h>
32 #include <workbook.h>
33 #include <workbook-control.h>
34 #include <wbc-gtk.h>
35 #include <gui-util.h>
36 #include <parse-util.h>
37 #include <commands.h>
38 #include <ranges.h>
39 #include <widgets/gnumeric-expr-entry.h>
40 #include <gtk/gtk.h>
41 #include <glib/gi18n.h>
43 #define DIALOG_DATA_TABLE_KEY "dialog-data-table"
45 typedef struct {
46 GtkBuilder *gui;
47 GtkWidget *dialog;
48 GnmExprEntry *row_entry, *col_entry;
50 WBCGtk *wbcg;
51 Sheet *sheet;
52 GnmRange input_range;
53 } GnmDialogDataTable;
55 static void
56 cb_data_table_destroy (GnmDialogDataTable *state)
58 if (state->gui != NULL)
59 g_object_unref (state->gui);
60 g_free (state);
63 static GnmExprEntry *
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,
73 GNM_EE_MASK);
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);
76 return gee;
79 static void
80 cb_data_table_response (GtkWidget *dialog, gint response_id, GnmDialogDataTable *state)
82 if (response_id == GTK_RESPONSE_HELP)
83 return;
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);
92 static gboolean
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)
97 return TRUE;
99 state->dialog = go_gtk_builder_get_widget (state->gui, "DataTable");
100 gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state->dialog),
101 state->wbcg,
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));
125 return FALSE;
128 void
129 dialog_data_table (WBCGtk *wbcg)
131 GnmDialogDataTable *state;
132 GnmRange const *r;
133 GnmRange input_range;
134 SheetView *sv;
135 Sheet *sheet;
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))
141 return;
143 sv = wb_control_cur_sheet_view (GNM_WBC (wbcg));
144 r = selection_first_range (sv, GO_CMD_CONTEXT (wbcg), _("Create Data Table"));
145 if (NULL == r)
146 return;
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);
151 g_error_free (msg);
152 return;
154 input_range = *r;
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")))
160 return;
161 if (cmd_cell_range_is_locked_effective
162 (sheet, &input_range, GNM_WBC (wbcg),
163 _("Data Table")))
164 return;
167 state = g_new0 (GnmDialogDataTable, 1);
168 state->wbcg = wbcg;
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."));
174 g_free (state);