static void constraint_select_click (GtkTreeSelection *Selection, SolverState * state) { GtkTreeModel *store; GtkTreeIter iter; GnmSolverConstraint const *c; GnmValue const *lhs, *rhs; if (gtk_tree_selection_get_selected (Selection, &store, &iter)) gtk_tree_model_get (store, &iter, 1, &state->constr, -1); else state->constr = NULL; dialog_set_sec_button_sensitivity (NULL, state); if (state->constr == NULL) return; /* Fail? */ c = state->constr; lhs = gnm_solver_constraint_get_lhs (c); if (lhs) { GnmExprTop const *texpr = gnm_expr_top_new_constant (value_dup (lhs)); GnmParsePos pp; gnm_expr_entry_load_from_expr (state->lhs.entry, texpr, parse_pos_init_sheet (&pp, state->sheet)); gnm_expr_top_unref (texpr); } else gnm_expr_entry_load_from_text (state->lhs.entry, ""); rhs = gnm_solver_constraint_get_rhs (c); if (rhs && gnm_solver_constraint_has_rhs (c)) { GnmExprTop const *texpr = gnm_expr_top_new_constant (value_dup (rhs)); GnmParsePos pp; gnm_expr_entry_load_from_expr (state->rhs.entry, texpr, parse_pos_init_sheet (&pp, state->sheet)); gnm_expr_top_unref (texpr); } else gnm_expr_entry_load_from_text (state->rhs.entry, ""); gtk_combo_box_set_active (state->type_combo, c->type); }
static void define_name (const char *name, const char *expr_txt, gpointer scope) { GnmParsePos pos; GnmExprTop const *texpr; GnmNamedExpr const *nexpr; GnmConventions const *convs; if (IS_SHEET (scope)) { parse_pos_init_sheet (&pos, scope); convs = sheet_get_conventions (pos.sheet); } else { parse_pos_init (&pos, WORKBOOK (scope), NULL, 0, 0); convs = gnm_conventions_default; } texpr = gnm_expr_parse_str (expr_txt, &pos, GNM_EXPR_PARSE_DEFAULT, convs, NULL); if (!texpr) { g_printerr ("Failed to parse %s for name %s\n", expr_txt, name); return; } nexpr = expr_name_add (&pos, name, texpr, NULL, TRUE, NULL); if (!nexpr) g_printerr ("Failed to add name %s\n", name); }
static void dialog_goto_load_selection (GotoState *state) { SheetView *sv = wb_control_cur_sheet_view (WORKBOOK_CONTROL (state->wbcg)); GnmRange const *first = selection_first_range (sv, NULL, NULL); if (first != NULL) { gint rows = range_height (first); gint cols = range_width (first); GnmConventionsOut out; GString *str = g_string_new (NULL); GnmParsePos pp; GnmRangeRef rr; out.accum = str; out.pp = parse_pos_init_sheet (&pp, sv->sheet); out.convs = sheet_get_conventions (sv->sheet); gnm_cellref_init (&rr.a, NULL, first->start.col, first->start.row, TRUE); gnm_cellref_init (&rr.b, NULL, first->start.col, first->start.row, TRUE); rangeref_as_string (&out, &rr); gtk_entry_set_text (state->goto_text, str->str); gtk_editable_select_region (GTK_EDITABLE (state->goto_text), 0, -1); g_string_free (str, TRUE); cb_dialog_goto_update_sensitivity (NULL, state); gtk_spin_button_set_value (state->spin_rows, rows); gtk_spin_button_set_value (state->spin_cols, cols); } else cb_dialog_goto_update_sensitivity (NULL, state); }
static void cb_dialog_goto_selection_changed (GtkTreeSelection *the_selection, GotoState *state) { GtkTreeIter iter; GtkTreeModel *model; Sheet *sheet; GnmNamedExpr *name; if (gtk_tree_selection_get_selected (the_selection, &model, &iter)) { gtk_tree_model_get (model, &iter, SHEET_POINTER, &sheet, EXPRESSION, &name, -1); if (name && gnm_expr_top_is_rangeref (name->texpr)) { GnmParsePos pp; char *where_to; if (NULL == sheet) sheet = wb_control_cur_sheet ( WORKBOOK_CONTROL (state->wbcg)); parse_pos_init_sheet (&pp, sheet); where_to = expr_name_as_string (name, &pp, gnm_conventions_default); if (wb_control_parse_and_jump (WORKBOOK_CONTROL (state->wbcg), where_to)) gtk_entry_set_text (state->goto_text, where_to); g_free (where_to); return; } if (sheet) wb_view_sheet_focus ( wb_control_view (WORKBOOK_CONTROL (state->wbcg)), sheet); } }
static GODataCache * gdcs_allocate (GODataCacheSource const *src) { GnmDataCacheSource *gdcs = (GnmDataCacheSource *)src; GODataCache *res; g_return_val_if_fail (gdcs->src_sheet != NULL, NULL); if (NULL != gdcs->src_name) { GnmParsePos pp; GnmEvalPos ep; GnmNamedExpr *nexpr = expr_name_lookup ( parse_pos_init_sheet (&pp, gdcs->src_sheet), gdcs->src_name->str); if (NULL != nexpr) { GnmValue *v = expr_name_eval (nexpr, eval_pos_init_sheet (&ep, gdcs->src_sheet), GNM_EXPR_EVAL_PERMIT_NON_SCALAR | GNM_EXPR_EVAL_PERMIT_EMPTY); if (NULL != v) { value_release (v); } } } res = g_object_new (GO_DATA_CACHE_TYPE, NULL); return res; }
/** * expr_name_perm_add: * @name: name * @texpr: string to be the value of the name * @is_editable: whether this is a predefined action * * This is a wrapper around expr_name_add to set this as permanent name. * * **/ void expr_name_perm_add (Sheet *sheet, char const *name, GnmExprTop const *value, gboolean is_editable) { GnmNamedExpr *res; GnmParsePos pp; parse_pos_init_sheet (&pp, sheet); res = expr_name_add (&pp, name, value, NULL, TRUE, NULL); if (res) { res->is_permanent = TRUE; res->is_editable = is_editable; } }
static GnmValue * dialog_goto_get_val (GotoState *state) { char const *text = gtk_entry_get_text (state->goto_text); Sheet *sheet = wb_control_cur_sheet (WORKBOOK_CONTROL (state->wbcg)); GnmValue *val = value_new_cellrange_str (sheet, text); if (val == NULL) { GnmParsePos pp; GnmNamedExpr *nexpr = expr_name_lookup (parse_pos_init_sheet (&pp, sheet), text); if (nexpr != NULL && !expr_name_is_placeholder (nexpr)) { val = gnm_expr_top_get_range (nexpr->texpr); } } return val; }
/* * This is called when something is entered in the location entry. * We either go there (if the text refers to a cell by address or * name), or we try to define a name for the selection. */ gboolean wb_control_parse_and_jump (WorkbookControl *wbc, char const *text) { Sheet *sheet = wb_control_cur_sheet (wbc); GnmParsePos pp; GnmEvalPos ep; GnmValue *target; GnmRangeRef range; SheetView *sv; if (text == NULL || *text == '\0') return FALSE; sv = wb_control_cur_sheet_view (wbc); parse_pos_init_editpos (&pp, sv); target = value_new_cellrange_parsepos_str (&pp, text, GNM_EXPR_PARSE_DEFAULT); if (target == NULL) { /* Not an address; is it a name? */ GnmParsePos pp; GnmNamedExpr *nexpr = expr_name_lookup ( parse_pos_init_sheet (&pp, sheet), text); /* If no name, or just a placeholder exists create a name */ if (nexpr == NULL || expr_name_is_placeholder (nexpr)) { wb_create_name (wbc, text, &pp); return FALSE; } else { target = gnm_expr_top_get_range (nexpr->texpr); if (target == NULL) { go_cmd_context_error_invalid (GO_CMD_CONTEXT (wbc), _("Address"), text); return FALSE; } } } eval_pos_init_editpos (&ep, sv); gnm_cellref_make_abs (&range.a, &target->v_range.cell.a, &ep); gnm_cellref_make_abs (&range.b, &target->v_range.cell.b, &ep); value_release (target); return wb_control_jump (wbc, sheet, &range); }
/** * global_range_list_parse: * @sheet: Sheet where the range specification is relatively parsed to * @str : a range or list of ranges to parse (ex: "A1", "A1:B1,C2,Sheet2!D2:D4") * * Parses a list of ranges, relative to the @sheet and returns a list with the * results. * * Returns a GSList containing Values of type VALUE_CELLRANGE, or NULL on failure **/ GSList * global_range_list_parse (Sheet *sheet, char const *str) { GnmParsePos pp; GnmExprTop const *texpr; GSList *ranges = NULL; GnmValue *v; g_return_val_if_fail (IS_SHEET (sheet), NULL); g_return_val_if_fail (str != NULL, NULL); texpr = gnm_expr_parse_str (str, parse_pos_init_sheet (&pp, sheet), GNM_EXPR_PARSE_FORCE_EXPLICIT_SHEET_REFERENCES | GNM_EXPR_PARSE_PERMIT_MULTIPLE_EXPRESSIONS | GNM_EXPR_PARSE_UNKNOWN_NAMES_ARE_STRINGS, NULL, NULL); if (texpr != NULL) { if (GNM_EXPR_GET_OPER (texpr->expr) == GNM_EXPR_OP_SET) { GnmExpr const *expr = texpr->expr; int i; for (i = 0; i < expr->set.argc; i++) { v = gnm_expr_get_range (expr->set.argv[i]); if (v == NULL) { range_list_destroy (ranges); ranges = NULL; break; } else ranges = g_slist_prepend (ranges, v); } } else { v = gnm_expr_top_get_range (texpr); if (v != NULL) ranges = g_slist_prepend (ranges, v); } gnm_expr_top_unref (texpr); } return g_slist_reverse (ranges); }
static GnmExprEntry * init_entry (GnmDialogSOList *state, GtkBuilder *gui, int col, int row, GnmExprTop const *texpr) { GnmExprEntry *gee = gnm_expr_entry_new (state->wbcg, TRUE); GtkWidget *w = GTK_WIDGET (gee); GtkGrid *grid = GTK_GRID (gtk_builder_get_object (gui, "main-grid")); Sheet *sheet = sheet_object_get_sheet (state->so); GnmParsePos pp; g_return_val_if_fail (w != NULL, NULL); gtk_grid_attach (grid, w, col, row, 1, 1); gnm_expr_entry_set_flags (gee, GNM_EE_FORCE_ABS_REF | GNM_EE_SHEET_OPTIONAL | GNM_EE_SINGLE_RANGE, GNM_EE_MASK); parse_pos_init_sheet (&pp, sheet); gnm_expr_entry_load_from_expr (gee, texpr, &pp); return gee; }
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); }