static void render_cell (GString *target, HFRenderInfo *info, char const *args) { gboolean use_repeating = FALSE; if (args && ((use_repeating = g_str_has_prefix (args, "rep|")))) args += 4; if (info->sheet) { GnmRangeRef ref; GnmValue const *val; char const *tmp; GnmParsePos ppos; parse_pos_init (&ppos, info->sheet->workbook, (Sheet *)info->sheet, 0, 0); tmp = rangeref_parse (&ref, args, &ppos, sheet_get_conventions (info->sheet)); if (tmp == NULL || tmp == args) { gnm_cellref_init (&ref.a, (Sheet *)(info->sheet), 0, 0, FALSE); } if (ref.a.row_relative) ref.a.row += (use_repeating ? info->top_repeating.row : info->page_area.start.row); if (ref.a.col_relative) ref.a.col += (use_repeating ? info->top_repeating.col : info->page_area.start.col); val = sheet_cell_get_value (ref.a.sheet ? ref.a.sheet : (Sheet *)(info->sheet), ref.a.col, ref.a.row); if (val != NULL) { char const *value; value = value_peek_string (val); g_string_append (target, value); } } else { if (use_repeating) g_string_append (target, "["); g_string_append (target, args); if (use_repeating) g_string_append (target, "]"); } }
static GtkWidget * vcombo_create_list (SheetObject *so, GtkTreePath **clip, GtkTreePath **select, gboolean *make_buttons) { GnmValidationCombo *vcombo = GNM_VALIDATION_COMBO (so); unsigned i; UniqueCollection uc; GnmEvalPos ep; GtkTreeIter iter; GtkWidget *list; GPtrArray *sorted; GtkListStore *model; GnmValue *v; GnmValue const *cur_val; GnmValidation const *val = vcombo->validation; SheetView const *sv = vcombo->parent.sv; g_return_val_if_fail (val != NULL, NULL); g_return_val_if_fail (val->type == GNM_VALIDATION_TYPE_IN_LIST, NULL); g_return_val_if_fail (val->deps[0].texpr != NULL, NULL); g_return_val_if_fail (sv != NULL, NULL); eval_pos_init_editpos (&ep, sv); v = gnm_expr_top_eval (val->deps[0].texpr, &ep, GNM_EXPR_EVAL_PERMIT_NON_SCALAR | GNM_EXPR_EVAL_PERMIT_EMPTY | GNM_EXPR_EVAL_ARRAY_CONTEXT); if (NULL == v) return NULL; uc.date_conv = workbook_date_conv (sv->sheet->workbook); uc.hash = g_hash_table_new_full ((GHashFunc)value_hash, (GEqualFunc)value_equal, (GDestroyNotify)value_release, (GDestroyNotify)g_free); value_area_foreach (v, &ep, CELL_ITER_IGNORE_BLANK, (GnmValueIterFunc) cb_collect_unique, &uc); value_release (v); sorted = g_ptr_array_new (); g_hash_table_foreach (uc.hash, (GHFunc)cb_hash_domain, sorted); qsort (&g_ptr_array_index (sorted, 0), sorted->len, sizeof (char *), &value_cmp); model = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, gnm_value_get_type ()); cur_val = sheet_cell_get_value (ep.sheet, ep.eval.col, ep.eval.row); for (i = 0; i < sorted->len ; i++) { char *label = NULL; unsigned const max = 50; char const *str = g_hash_table_lookup (uc.hash, (v = g_ptr_array_index (sorted, i))); gsize len = g_utf8_strlen (str, -1); if (len > max + 3) { label = g_strdup (str); strcpy (g_utf8_offset_to_pointer (label, max), "..."); } gtk_list_store_append (model, &iter); gtk_list_store_set (model, &iter, 0, label ? label : str, /* Menu text */ 1, str, /* Actual string selected on. */ -1); g_free (label); if (i == 10) *clip = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter); if (cur_val != NULL && v != NULL && value_equal (cur_val, v)) { gtk_tree_path_free (*select); *select = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter); } } g_hash_table_destroy (uc.hash); g_ptr_array_free (sorted, TRUE); list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); g_object_unref (model); gtk_tree_view_append_column (GTK_TREE_VIEW (list), gtk_tree_view_column_new_with_attributes ("ID", gtk_cell_renderer_text_new (), "text", 0, NULL)); return list; }
int gnumeric_sheet_get_cell(GnumericSheetPtr sheet, int x, int y, GSheetCellPtr cell) { gsheetcell_zero(cell); GnmValue const *value = sheet_cell_get_value((Sheet*)sheet,x,y); if (value==NULL) return 0; if (value->type == VALUE_EMPTY) return 0; GnmCell const *gcell = sheet_cell_get((Sheet*)sheet,x,y); if (gcell) { if (gnm_cell_has_expr (gcell)) { if (gcell->base.texpr->expr) { const GnmExpr *expr = gcell->base.texpr->expr; if (expr) { if (expr->oper==GNM_EXPR_OP_FUNCALL) { if (expr->func.func) { const char *name = expr->func.func->name; if (name) { if (strcasecmp(name,"hyperlink")==0) { // Hyperlink. Take url part. char *url = NULL; char *txt = NULL; if (expr->func.argc==2) { const GnmExpr *expr0 = expr->func.argv[0]; if (expr0) { if (expr0->oper == GNM_EXPR_OP_CONSTANT) { url = value_get_as_string(expr0->constant.value); } } const GnmExpr *expr1 = expr->func.argv[1]; if (expr1) { if (expr1->oper == GNM_EXPR_OP_CONSTANT) { txt = value_get_as_string(expr1->constant.value); } } } if (url&&txt) { if (strcasecmp(url,txt)==0) { cell->all = url; cell->url = g_strdup(url); cell->txt = g_strdup(url); cell->is_url = 1; return 0; } cell->all = g_strconcat("[",url,"|",txt,"]",NULL); cell->url = url; cell->txt = txt; cell->is_url = 1; return 0; } else { if (url) g_free(url); if (txt) g_free(txt); } } } } } } } //return gnm_cell_get_entered_text(cell); } } GnmStyle const *style = sheet_style_get((Sheet*)sheet,x,y); GnmHLink* hlink = gnm_style_get_hlink (style); const guchar* hlink_target = NULL; if (hlink && IS_GNM_HLINK_URL (hlink)) { hlink_target = gnm_hlink_get_target (hlink); if (hlink_target) { //char *str = value_get_as_string(value); //if (!str) return str; //const char *str2 = " "; //char *result = g_strconcat(str,str2,hlink_target); //g_free(str); //return result; cell->is_url = 1; cell->all = g_strdup(hlink_target); cell->url = g_strdup(hlink_target); cell->txt = g_strdup(hlink_target); return 0; } } cell->all = value_get_as_string(value); return 0; }
char *gnumeric_sheet_get_cell_as_string(GnumericSheetPtr sheet, int x, int y) { GnmValue const *value = sheet_cell_get_value((Sheet*)sheet,x,y); if (value==NULL) return NULL; if (value->type == VALUE_EMPTY) return NULL; return value_get_as_string(value); }