static void search_get_value (gint row, gint column, gpointer _dd, GValue *value) { DialogState *dd = (DialogState *)_dd; GnumericLazyList *ll = GNUMERIC_LAZY_LIST (gtk_tree_view_get_model (dd->matches_table)); GnmSearchFilterResult *item = g_ptr_array_index (dd->matches, row); GnmCell *cell; GnmComment *comment; if (item->locus == GNM_SRL_COMMENT) { cell = NULL; comment = sheet_get_comment (item->ep.sheet, &item->ep.eval); } else { cell = sheet_cell_get (item->ep.sheet, item->ep.eval.col, item->ep.eval.row); comment = NULL; } g_value_init (value, ll->column_headers[column]); #if 0 g_print ("col=%d,row=%d\n", column, row); #endif switch (column) { case COL_SHEET: g_value_set_string (value, item->ep.sheet->name_unquoted); return; case COL_CELL: g_value_set_string (value, cellpos_as_string (&item->ep.eval)); return; case COL_TYPE: switch (item->locus) { case GNM_SRL_COMMENT: g_value_set_static_string (value, _("Comment")); return; case GNM_SRL_VALUE: g_value_set_static_string (value, _("Result")); return; case GNM_SRL_CONTENTS: { GnmValue *v = cell ? cell->value : NULL; char const *type; gboolean is_expr = cell && gnm_cell_has_expr (cell); gboolean is_value = !is_expr && !gnm_cell_is_empty (cell) && v; if (!cell) type = _("Deleted"); else if (is_expr) type = _("Expression"); else if (is_value && VALUE_IS_STRING (v)) type = _("String"); else if (is_value && VALUE_IS_FLOAT (v)) type = _("Number"); else type = _("Other value"); g_value_set_static_string (value, type); return; } #ifndef DEBUG_SWITCH_ENUM default: g_assert_not_reached (); #endif } case COL_CONTENTS: switch (item->locus) { case GNM_SRL_COMMENT: if (comment) g_value_set_string (value, cell_comment_text_get (comment)); else g_value_set_static_string (value, _("Deleted")); return; case GNM_SRL_VALUE: if (cell && cell->value) g_value_take_string (value, value_get_as_string (cell->value)); else g_value_set_static_string (value, _("Deleted")); return; case GNM_SRL_CONTENTS: if (cell) g_value_take_string (value, gnm_cell_get_entered_text (cell)); else g_value_set_static_string (value, _("Deleted")); return; #ifndef DEBUG_SWITCH_ENUM default: g_assert_not_reached (); #endif } #ifndef DEBUG_SWITCH_ENUM default: g_assert_not_reached (); #endif } }
void dialog_cell_comment (WBCGtk *wbcg, Sheet *sheet, GnmCellPos const *pos) { CommentState *state; GtkWidget *box, *check, *old_author, *new_author; GnmComment *comment; GtkBuilder *gui; char *title, *cell_name; char const*real_user; GnmCellRef ref; GnmParsePos pp; GnmConventionsOut out; g_return_if_fail (wbcg != NULL); g_return_if_fail (sheet != NULL); g_return_if_fail (pos != NULL); if (gnumeric_dialog_raise_if_exists (wbcg, COMMENT_DIALOG_KEY)) return; gui = gnm_gtk_builder_new ("cell-comment.ui", NULL, GO_CMD_CONTEXT (wbcg)); if (gui == NULL) return; state = g_new (CommentState, 1); state->wbcg = wbcg; state->sheet = sheet; state->pos = pos; state->gui = gui; state->dialog = go_gtk_builder_get_widget (state->gui, "comment_dialog"); g_return_if_fail (state->dialog != NULL); box = go_gtk_builder_get_widget (state->gui, "dialog-vbox"); g_return_if_fail (box != NULL); state->gtv = gnm_text_view_new (); gtk_widget_show_all (GTK_WIDGET (state->gtv)); gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (state->gtv), TRUE, TRUE, TRUE); g_object_set (state->gtv, "wrap", GTK_WRAP_WORD, NULL); gnm_cellref_init (&ref, sheet, pos->col, pos->row, FALSE); out.accum = g_string_new (NULL); parse_pos_init_sheet (&pp, sheet); out.pp = &pp; out.convs = sheet->convs; cellref_as_string (&out, &ref, FALSE); cell_name = g_string_free (out.accum, FALSE); old_author = go_gtk_builder_get_widget (state->gui, "old-author-entry"); new_author = go_gtk_builder_get_widget (state->gui, "new-author-entry"); real_user = g_get_real_name (); if ((real_user != NULL) && g_utf8_validate (real_user, -1, NULL)) { gtk_entry_set_text (GTK_ENTRY (new_author), real_user); gtk_editable_select_region (GTK_EDITABLE (new_author), 0, -1); } comment = sheet_get_comment (sheet, pos); if (comment) { char const *text; PangoAttrList *attr; g_object_get (G_OBJECT (comment), "text", &text, "markup", &attr, NULL); g_object_set (state->gtv, "text", text, "attributes", attr, NULL); if (attr != NULL) pango_attr_list_unref (attr); text = cell_comment_author_get (comment); if (text != NULL) gtk_label_set_text (GTK_LABEL (old_author), text); title = g_strdup_printf (_("Edit Cell Comment (%s)"), cell_name); } else { title = g_strdup_printf (_("New Cell Comment (%s)"), cell_name); gtk_widget_hide (old_author); gtk_widget_hide (go_gtk_builder_get_widget (state->gui, "old-author-label")); } gtk_window_set_title (GTK_WINDOW (state->dialog), title); g_free (title); state->ok_button = go_gtk_builder_get_widget (state->gui, "ok_button"); g_signal_connect (G_OBJECT (state->ok_button), "clicked", G_CALLBACK (cb_cell_comment_ok_clicked), state); state->cancel_button = go_gtk_builder_get_widget (state->gui, "cancel_button"); g_signal_connect (G_OBJECT (state->cancel_button), "clicked", G_CALLBACK (cb_cell_comment_cancel_clicked), state); check = go_gtk_builder_get_widget (state->gui, "wrap-check"); g_signal_connect (G_OBJECT (check), "toggled", G_CALLBACK (cb_wrap_toggled), state->gtv); cb_wrap_toggled (GTK_TOGGLE_BUTTON (check), G_OBJECT (state->gtv)); gnumeric_init_help_button ( go_gtk_builder_get_widget (state->gui, "help_button"), GNUMERIC_HELP_LINK_CELL_COMMENT); wbc_gtk_attach_guru (state->wbcg, state->dialog); g_object_set_data_full (G_OBJECT (state->dialog), "state", state, (GDestroyNotify) cb_dialog_cell_comment_destroy); gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state->dialog), state->wbcg, GNM_DIALOG_DESTROY_CURRENT_SHEET_REMOVED); gnumeric_keyed_dialog (state->wbcg, GTK_WINDOW (state->dialog), COMMENT_DIALOG_KEY); gtk_widget_show (state->dialog); }