static void activate_column (StfDialogData *pagedata, int i) { GtkCellRenderer *cell; GtkTreeViewColumn *column; RenderData_t *renderdata = pagedata->format.renderdata; cell = stf_preview_get_cell_renderer (renderdata, pagedata->format.index); if (cell) { g_object_set (G_OBJECT (cell), "background", NULL, NULL); } pagedata->format.index = i; column = stf_preview_get_column (renderdata, i); if (column) { tree_view_clamp_column_visible (renderdata->tree_view, column); } cell = stf_preview_get_cell_renderer (renderdata, i); if (cell) { g_object_set (G_OBJECT (cell), "background", "lightgrey", NULL); gtk_widget_queue_draw (GTK_WIDGET (renderdata->tree_view)); } /* FIXME: warp focus away from the header. */ }
static gboolean cb_treeview_motion (GtkWidget *widget, GdkEventMotion *event, StfDialogData *pagedata) { int x = (int)event->x; int col, dx; RenderData_t *renderdata = pagedata->fixed.renderdata; int old_ruler_x = pagedata->fixed.ruler_x; int colstart, colend, colwidth; gpointer user; pagedata->fixed.ruler_x = -1; /* We get events from the buttons too. Translate x. */ gdk_window_get_user_data (event->window, &user); if (GTK_IS_BUTTON (user)) { int ewx; gdk_window_get_position (event->window, &ewx, NULL); x += ewx; } stf_preview_find_column (renderdata, x, &col, &dx); colstart = (col == 0) ? 0 : stf_parse_options_fixed_splitpositions_nth (pagedata->parseoptions, col - 1); colend = stf_parse_options_fixed_splitpositions_nth (pagedata->parseoptions, col); colwidth = (colend == -1) ? G_MAXINT : colend - colstart; if (col >= 0 && col < renderdata->colcount) { int ci = calc_char_index (renderdata, col, &dx); if (ci <= colwidth) { int padx; GtkCellRenderer *cell = stf_preview_get_cell_renderer (renderdata, col); gtk_cell_renderer_get_padding (cell, &padx, NULL); pagedata->fixed.ruler_x = x - dx + padx; } } gdk_event_request_motions (event); if (pagedata->fixed.ruler_x == old_ruler_x) return FALSE; queue_redraw (widget, old_ruler_x); queue_redraw (widget, pagedata->fixed.ruler_x); return FALSE; }
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; }
/** * 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 int calc_char_index (RenderData_t *renderdata, int col, int *dx) { GtkCellRenderer *cell = stf_preview_get_cell_renderer (renderdata, col); PangoLayout *layout; PangoFontDescription *font_desc; int ci, width, padx; gtk_cell_renderer_get_padding (cell, &padx, NULL); g_object_get (G_OBJECT (cell), "font_desc", &font_desc, NULL); layout = gtk_widget_create_pango_layout (GTK_WIDGET (renderdata->tree_view), "x"); pango_layout_set_font_description (layout, font_desc); pango_layout_get_pixel_size (layout, &width, NULL); g_object_unref (layout); pango_font_description_free (font_desc); if (width < 1) width = 1; ci = (*dx < padx) ? 0 : (*dx - padx + width / 2) / width; *dx -= ci * width; return ci; }
/** * 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); }