int ssd_transpose(Quark *q) { ss_data *ssd_new, *ssd_old; unsigned int ncols, nrows, i, j; if (!ssd_is_numeric(q)) { return RETURN_FAILURE; } ncols = ssd_get_ncols(q); nrows = ssd_get_nrows(q); if (!ncols || !nrows) { return RETURN_FAILURE; } ssd_new = ssd_data_new(q->amem); if (!ssd_new) { return RETURN_FAILURE; } /* swap the data */ ssd_old = q->data; q->data = ssd_new; if (ssd_set_ncols(q, nrows, NULL) != RETURN_SUCCESS || ssd_set_nrows(q, ncols) != RETURN_SUCCESS) { ssd_data_free(q->amem, ssd_new); q->data = ssd_old; return RETURN_FAILURE; } for (i = 0; i < ncols; i++) { for (j = 0; j < nrows; j++) { ssd_set_value(q, i, j, ((double *)ssd_old->cols[i].data)[j]); } } quark_dirtystate_set(q, TRUE); ssd_data_free(q->amem, ssd_old); return RETURN_SUCCESS; }
static int leaveCB(TableEvent *event) { SSDataUI *ui = (SSDataUI *) event->anydata; int nrows = ssd_get_nrows(ui->q); int ncols = ssd_get_ncols(ui->q); int format; double value; int changed = FALSE; GraceApp *gapp = gapp_from_quark(ui->q); if (event->row < 0 || event->col < 0 || event->col > ncols) { return TRUE; } if (event->row >= nrows && !string_is_empty(event->value)) { if (ssd_set_nrows(ui->q, event->row + 1) == RETURN_SUCCESS) { changed = TRUE; } } if (event->col == ncols && !string_is_empty(event->value)) { if (parse_date_or_number(get_parent_project(ui->q), event->value, FALSE, get_date_hint(gapp), &value) == RETURN_SUCCESS) { format = FFORMAT_NUMBER; } else { format = FFORMAT_STRING; } if (ssd_add_col(ui->q, format)) { ncols++; changed = TRUE; } } if (event->col < ncols) { char *old_value = get_cell_content(ui, event->row, event->col, &format); if (!strings_are_equal(old_value, event->value)) { switch (format) { case FFORMAT_STRING: if (ssd_set_string(ui->q, event->row, event->col, event->value) == RETURN_SUCCESS) { quark_dirtystate_set(ui->q, TRUE); changed = TRUE; } break; default: if (graal_eval_expr(grace_get_graal(gapp->grace), event->value, &value, gproject_get_top(gapp->gp)) == RETURN_SUCCESS) { unsigned int prec; char buf[32]; double val; prec = project_get_prec(get_parent_project(ui->q)); sprintf(buf, "%.*g", prec, value); if (parse_date_or_number(get_parent_project(ui->q), buf, FALSE, get_date_hint(gapp), &val) == RETURN_SUCCESS) { if (ssd_set_value(ui->q, event->row, event->col, val) == RETURN_SUCCESS) { quark_dirtystate_set(ui->q, TRUE); changed = TRUE; } } } else { errmsg("Can't parse input value"); return FALSE; } break; } } } if (changed) { snapshot_and_update(gapp->gp, FALSE); } return TRUE; }