void stf_preview_find_column (RenderData_t *renderdata, int x, int *pcol, int *dx) { int col; *dx = 0; /* Figure out what column we pressed in. */ for (col = 0; 1; col++) { GtkWidget *w; GtkAllocation a; GtkTreeViewColumn *column = stf_preview_get_column (renderdata, col); if (!column) break; w = gtk_bin_get_child (GTK_BIN (gtk_tree_view_column_get_button (column))); gtk_widget_get_allocation (w, &a); if (x < a.x + a.width) { *dx = x - a.x; break; } } *pcol = col; }
static void select_column (StfDialogData *pagedata, int col) { int colcount = stf_parse_options_fixed_splitpositions_count (pagedata->parseoptions); GtkTreeViewColumn *column; if (col < 0 || col >= colcount) return; column = stf_preview_get_column (pagedata->fixed.renderdata, col); gtk_widget_grab_focus (gtk_tree_view_column_get_button (column)); }
static void cb_format_clicked (GtkButton *widget, gpointer _i) { int i = GPOINTER_TO_INT (_i); StfDialogData *pagedata = g_object_get_data (G_OBJECT (widget), "pagedata"); gint result; GOFormat *sf; GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Format Selector"), GTK_WINDOW (pagedata->dialog), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); GOFormatSel *format_selector = GO_FORMAT_SEL (go_format_sel_new_full (TRUE)); GtkWidget *w = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); GtkTreeViewColumn* column; GtkWidget *format_label; sf = g_ptr_array_index (pagedata->format.formats, i); go_format_sel_set_style_format (format_selector, sf); go_format_sel_set_locale (format_selector, pagedata->locale); gtk_box_pack_start (GTK_BOX (w), GTK_WIDGET (format_selector), FALSE, TRUE, 5); gtk_widget_show (GTK_WIDGET (format_selector)); result = gtk_dialog_run (GTK_DIALOG (dialog)); switch (result) { case GTK_RESPONSE_ACCEPT: column = stf_preview_get_column (pagedata->format.renderdata, i); format_label = g_object_get_data (G_OBJECT (column), "formatlabel"); sf = g_ptr_array_index (pagedata->format.formats, i); go_format_unref (sf); sf = go_format_ref (go_format_sel_get_fmt (format_selector)); gtk_button_set_label (GTK_BUTTON (format_label), go_format_sel_format_classification (sf)); g_ptr_array_index (pagedata->format.formats, i) = sf; format_page_update_preview (pagedata); default: break; } gtk_widget_destroy (dialog); return; }
static void cb_col_check_clicked (GtkToggleButton *togglebutton, gpointer _i) { int i = GPOINTER_TO_INT (_i); StfDialogData *pagedata = g_object_get_data (G_OBJECT (togglebutton), "pagedata"); gboolean active = gtk_toggle_button_get_active (togglebutton); GtkCellRenderer *renderer; GtkTreeViewColumn* column; GtkWidget *check_autofit; g_return_if_fail (i < pagedata->format.col_import_array_len); if (pagedata->format.col_import_array[i] == active) return; renderer = stf_preview_get_cell_renderer (pagedata->format.renderdata, i); g_object_set (G_OBJECT (renderer), "strikethrough", !active, NULL); gtk_widget_queue_draw (GTK_WIDGET (pagedata->format.renderdata->tree_view)); if (!active) { pagedata->format.col_import_array[i] = FALSE; pagedata->format.col_import_count--; format_page_update_column_selection (pagedata); } else { if (pagedata->format.col_import_count < GNM_MAX_COLS) { pagedata->format.col_import_array[i] = TRUE; pagedata->format.col_import_count++; format_page_update_column_selection (pagedata); } else { char *msg = g_strdup_printf( ngettext("A maximum of %d column can be imported.", "A maximum of %d columns can be imported.", GNM_MAX_COLS), GNM_MAX_COLS); gtk_toggle_button_set_active (togglebutton, FALSE); go_gtk_notice_dialog (GTK_WINDOW (pagedata->dialog), GTK_MESSAGE_WARNING, "%s", msg); g_free (msg); } } column = stf_preview_get_column (pagedata->format.renderdata, i); check_autofit = g_object_get_data (G_OBJECT (column), "checkbox-autofit"); gtk_widget_set_sensitive (check_autofit, active); return; }
GtkCellRenderer * stf_preview_get_cell_renderer (RenderData_t *renderdata, int col) { GtkCellRenderer *res = NULL; GtkTreeViewColumn *column = stf_preview_get_column (renderdata, col); if (column) { GList *renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(column)); if (renderers) { res = renderers->data; g_list_free (renderers); } } return res; }
/** * fixed_page_update_preview * @pagedata: mother struct * * Will simply update the preview * * returns : nothing **/ static void fixed_page_update_preview (StfDialogData *pagedata) { StfParseOptions_t *parseoptions = pagedata->parseoptions; RenderData_t *renderdata = pagedata->fixed.renderdata; int i; GStringChunk *lines_chunk; GPtrArray *lines; StfTrimType_t trim; lines_chunk = g_string_chunk_new (100 * 1024); /* Don't trim on this page. */ trim = parseoptions->trim_spaces; stf_parse_options_set_trim_spaces (parseoptions, TRIM_TYPE_NEVER); lines = stf_parse_general (parseoptions, lines_chunk, pagedata->cur, pagedata->cur_end); stf_parse_options_set_trim_spaces (parseoptions, trim); stf_preview_set_lines (renderdata, lines_chunk, lines); for (i = 0; i < renderdata->colcount; i++) { GtkTreeViewColumn *column = stf_preview_get_column (renderdata, i); GtkCellRenderer *cell = stf_preview_get_cell_renderer (renderdata, i); GtkWidget *button = gtk_tree_view_column_get_button (column); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); g_object_set (G_OBJECT (cell), "family", "monospace", NULL); g_object_set_data (G_OBJECT (button), "fixed-data", pagedata); g_object_set (G_OBJECT (column), "clickable", TRUE, NULL); g_signal_connect (button, "button_press_event", G_CALLBACK (cb_col_button_press), GINT_TO_POINTER (i)); g_signal_connect (button, "key_press_event", G_CALLBACK (cb_col_key_press), GINT_TO_POINTER (i)); } }
static gint cb_treeview_key_press (GtkWidget *treeview, GdkEventKey *event, StfDialogData *pagedata) { if (event->type == GDK_KEY_PRESS) { switch (event->keyval) { case GDK_KEY_Left: case GDK_KEY_KP_Left: if (pagedata->format.index > 0) activate_column (pagedata, pagedata->format.index - 1); return TRUE; case GDK_KEY_Right: case GDK_KEY_KP_Right: if (pagedata->format.index + 1 < (int)pagedata->format.formats->len) activate_column (pagedata, pagedata->format.index + 1); return TRUE; case GDK_KEY_space: case GDK_KEY_Return: { GtkTreeViewColumn *column = stf_preview_get_column (pagedata->format.renderdata, pagedata->format.index); GtkToggleButton *button = g_object_get_data (G_OBJECT (column), "checkbox"); gtk_toggle_button_set_active (button, !gtk_toggle_button_get_active (button)); return TRUE; } default: ; /* Nothing. */ } } return FALSE; }
static void uncheck_columns_for_import (StfDialogData *pagedata, int from, int to) { int i; g_return_if_fail (pagedata != NULL); g_return_if_fail (!(from < 0)); g_return_if_fail (to < pagedata->format.renderdata->colcount); g_return_if_fail (to < pagedata->format.col_import_array_len); for (i = from; i <= to; i++) { if (pagedata->format.col_import_array[i]) { GtkTreeViewColumn* column = stf_preview_get_column (pagedata->format.renderdata, i); GtkWidget *w = g_object_get_data (G_OBJECT (column), "checkbox"); gtk_widget_hide (w); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), FALSE); /* Note this caused a signal to be send that sets the */ /* pagedata fields */ gtk_widget_show (w); } } }
/** * format_page_update_preview * @pagedata: mother struct * * Will simply utilize the preview rendering functions to update * the preview * * returns : nothing **/ static void format_page_update_preview (StfDialogData *pagedata) { RenderData_t *renderdata = pagedata->format.renderdata; unsigned int ui; int i; int col_import_array_len_old, old_part; GStringChunk *lines_chunk; char *msg = NULL; stf_preview_colformats_clear (renderdata); for (ui = 0; ui < pagedata->format.formats->len; ui++) { GOFormat *sf = g_ptr_array_index (pagedata->format.formats, ui); stf_preview_colformats_add (renderdata, sf); } lines_chunk = g_string_chunk_new (100 * 1024); stf_preview_set_lines (renderdata, lines_chunk, stf_parse_general (pagedata->parseoptions, lines_chunk, pagedata->cur, pagedata->cur_end)); col_import_array_len_old = pagedata->format.col_import_array_len; pagedata->format.col_import_array_len = renderdata->colcount; pagedata->format.col_autofit_array = g_renew(gboolean, pagedata->format.col_autofit_array, pagedata->format.col_import_array_len); pagedata->format.col_import_array = g_renew(gboolean, pagedata->format.col_import_array, pagedata->format.col_import_array_len); old_part = (col_import_array_len_old < pagedata->format.col_import_array_len) ? col_import_array_len_old : pagedata->format.col_import_array_len; pagedata->format.col_import_count = 0; for (i = 0; i < old_part; i++) if (pagedata->format.col_import_array[i]) pagedata->format.col_import_count++; for (i = old_part; i < pagedata->format.col_import_array_len; i++) { if (pagedata->format.col_import_count < GNM_MAX_COLS) { pagedata->format.col_import_array[i] = TRUE; pagedata->format.col_import_count++; } else { pagedata->format.col_import_array[i] = FALSE; } pagedata->format.col_autofit_array[i] = TRUE; } format_page_update_column_selection (pagedata); if (old_part < renderdata->colcount) msg = g_strdup_printf (_("A maximum of %d columns can be imported."), GNM_MAX_COLS); for (i = old_part; i < renderdata->colcount; i++) { GtkTreeViewColumn *column = stf_preview_get_column (renderdata, i); GtkWidget *button = gtk_tree_view_column_get_button (column); if (NULL == g_object_get_data (G_OBJECT (column), "checkbox")) { GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); GtkWidget *check, *check_autofit = gtk_check_button_new_with_label (_("Auto fit")); char * label_text = g_strdup_printf (pagedata->format.col_header, i+1); GOFormat const *gf = go_format_general (); GtkWidget *format_label = gtk_button_new_with_label (go_format_sel_format_classification (gf)); GtkWidget *format_icon = gtk_image_new_from_stock (GTK_STOCK_INFO, GTK_ICON_SIZE_BUTTON); check = gtk_check_button_new_with_label (label_text); g_free (label_text); gtk_button_set_image (GTK_BUTTON (format_label), format_icon); g_object_set (G_OBJECT (stf_preview_get_cell_renderer (pagedata->format.renderdata, i)), "strikethrough", !pagedata->format.col_import_array[i], NULL); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(check), pagedata-> format.col_import_array[i]); label_text = g_strdup_printf (_("If this checkbox is selected, " "column %i will be imported into " "Gnumeric."), i+1); gtk_widget_set_tooltip_text (check, label_text); gtk_widget_set_tooltip_text (check_autofit, _("If this checkbox is selected, " "the width of the column will be adjusted " "to the longest entry.")); g_free (label_text); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(check_autofit), pagedata-> format.col_autofit_array[i]); g_object_set_data (G_OBJECT (check), "pagedata", pagedata); g_object_set_data (G_OBJECT (check_autofit), "pagedata", pagedata); g_object_set_data (G_OBJECT (format_label), "pagedata", pagedata); gtk_box_pack_start (GTK_BOX(vbox), check, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(vbox), format_label, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX(vbox), check_autofit, TRUE, TRUE, 0); gtk_widget_show_all (vbox); gtk_tree_view_column_set_widget (column, vbox); g_object_set_data (G_OBJECT (column), "pagedata", pagedata); g_object_set_data (G_OBJECT (column), "checkbox", check); g_object_set_data (G_OBJECT (column), "checkbox-autofit", check_autofit); g_object_set_data (G_OBJECT (column), "formatlabel", format_label); g_object_set_data (G_OBJECT (button), "pagedata", pagedata); g_object_set_data (G_OBJECT (button), "checkbox", check); g_object_set_data (G_OBJECT (button), "formatlabel", format_label); g_object_set (G_OBJECT (column), "clickable", TRUE, NULL); g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (cb_col_check_clicked), GINT_TO_POINTER (i)); g_signal_connect (G_OBJECT (check_autofit), "toggled", G_CALLBACK (cb_col_check_autofit_clicked), GINT_TO_POINTER (i)); g_signal_connect (G_OBJECT (format_label), "clicked", G_CALLBACK (cb_format_clicked), GINT_TO_POINTER (i)); g_signal_connect (G_OBJECT (button), "event", G_CALLBACK (cb_col_event), GINT_TO_POINTER (i)); } } g_free (msg); }