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; }
int set_project_data(ProjectUI *ui, Quark *q, void *caller) { Project *pr = project_get_data(q); int retval = RETURN_SUCCESS; if (ui && pr) { GraceApp *gapp = gapp_from_quark(q); double jul; if (!caller || caller == ui->prec) { project_set_prec(q, GetSpinChoice(ui->prec)); } if (!caller || caller == ui->description) { char *s = TextGetString(ui->description); project_set_description(q, s); xfree(s); } if (caller == ui->page_orient) { int wpp, hpp; int orientation = GetOptionChoice(ui->page_orient); project_get_page_dimensions(q, &wpp, &hpp); if ((orientation == PAGE_ORIENT_LANDSCAPE && wpp < hpp) || (orientation == PAGE_ORIENT_PORTRAIT && wpp > hpp)) { set_page_dimensions(gapp, hpp, wpp, TRUE); } } if (caller == ui->page_format) { int wpp, hpp; int orientation = GetOptionChoice(ui->page_orient); int format = GetOptionChoice(ui->page_format); GraceApp *gapp = gapp_from_quark(q); switch (format) { case PAGE_FORMAT_USLETTER: wpp = 792.0; hpp = 612.0; break; case PAGE_FORMAT_A4: wpp = 842.0; hpp = 595.0; break; default: return RETURN_SUCCESS; } if (orientation == PAGE_ORIENT_PORTRAIT) { iswap(&wpp, &hpp); } set_page_dimensions(gapp, wpp, hpp, TRUE); } if (!caller || caller == ui->page_x || caller == ui->page_y) { int page_units = GetOptionChoice(ui->page_size_unit); double factor, page_x, page_y; GraceApp *gapp = gapp_from_quark(q); if (xv_evalexpr(ui->page_x, &page_x) != RETURN_SUCCESS || xv_evalexpr(ui->page_y, &page_y) != RETURN_SUCCESS) { errmsg("Invalid page dimension(s)"); return RETURN_FAILURE; } switch (page_units) { case PAGE_UNITS_IN: factor = 72.0; break; case PAGE_UNITS_CM: factor = 72.0/CM_PER_INCH; break; default: factor = 1.0; break; } page_x *= factor; page_y *= factor; set_page_dimensions(gapp, (int) rint(page_x), (int) rint(page_y), TRUE); } if (!caller || caller == ui->bg_color) { pr->bgcolor = GetOptionChoice(ui->bg_color); } if (!caller || caller == ui->bg_fill) { pr->bgfill = GetToggleButtonState(ui->bg_fill); } if (!caller || caller == ui->fsize_scale) { pr->fscale = GetSpinChoice(ui->fsize_scale); } if (!caller || caller == ui->lwidth_scale) { pr->lscale = GetSpinChoice(ui->lwidth_scale); } if (!caller || caller == ui->refdate) { char *s = TextGetString(ui->refdate); if (parse_date_or_number(q, s, TRUE, get_date_hint(gapp), &jul) == RETURN_SUCCESS) { pr->ref_date = jul; } else { errmsg("Invalid date"); retval = RETURN_FAILURE; } xfree(s); } if (!caller || caller == ui->two_digits_years) { pr->two_digits_years = GetToggleButtonState(ui->two_digits_years); } if (!caller || caller == ui->wrap_year) { char *s = TextGetString(ui->wrap_year); pr->wrap_year = atoi(s); xfree(s); } quark_dirtystate_set(q, TRUE); } return retval; }