static void project_popup_any_cb(ExplorerUI *eui, int type) { TreeItemList items; Quark *q; GraceApp *gapp; GProject *gp; TreeGetHighlighted(eui->tree, &items); if (!items.count || items.count > 1) { xfree(items.items); return; } q = TreeGetQuark(items.items[0]); gapp = gapp_from_quark(q); gp = gproject_from_quark(q); switch (type) { case PROJECT_SHOW_CB: gapp_set_active_gproject(gapp, gp); xdrawgraph(gp); update_all(); break; case PROJECT_SAVE_CB: project_save(gp); break; case PROJECT_SAVE_AS_CB: project_save_as(gp); break; case PROJECT_REVERT_TO_SAVED_CB: revert_project(gapp, gp); xdrawgraph(gapp->gp); update_all(); break; case PROJECT_CLOSE_CB: if (gapp->gpcount == 1) { errmsg("Can't close the last project"); return; } if (gp && gproject_get_top(gp) && quark_dirtystate_get(gproject_get_top(gp)) && !yesno("Abandon unsaved changes?", NULL, NULL, NULL)) { return; } gapp_delete_gproject(gapp, gp); if (gapp->gp == NULL) { gapp_set_active_gproject(gapp, gapp->gplist[0]); } xdrawgraph(gapp->gp); update_all(); break; } xfree(items.items); }
static int load_project_file(GraceApp *gapp, const char *fn, int as_template) { GProject *gp; Quark *project, *gr, **graphs; int i, ngraphs; AMem *amem; if (gapp->gp && gproject_get_top(gapp->gp) && quark_dirtystate_get(gproject_get_top(gapp->gp)) && !yesno("Abandon unsaved changes?", NULL, NULL, NULL)) { return RETURN_FAILURE; } gproject_free(gapp->gp); gp = load_any_project(gapp, fn); if (!gp) { errmsg("Failed loading project file"); return RETURN_FAILURE; } project = gproject_get_top(gp); gapp->rt->print_file[0] = '\0'; gapp_set_project(gapp, gp); if (as_template) { grfile_free(gp->grf); gp->grf = NULL; } amem = quark_get_amem(project); /* Set undo limit of 16MB */ amem_set_undo_limit(amem, 0x1000000L); /* Get initial memory snapshot */ amem_snapshot(amem); /* try to switch to the first active graph */ ngraphs = project_get_graphs(project, &graphs); for (i = 0; i < ngraphs; i++) { gr = graphs[i]; if (select_graph(gr) == RETURN_SUCCESS) { break; } } xfree(graphs); #ifndef NONE_GUI select_quark_explorer(project); update_all(); #endif if (project) { return RETURN_SUCCESS; } else { return RETURN_FAILURE; } }
/* * exit gapp */ void bailout(GraceApp *gapp) { int i; for (i = 0; i < gapp->gpcount; i++) { if (gapp->gplist[i] && quark_dirtystate_get(gproject_get_top(gapp->gplist[i]))) { if (yesno("Exit losing unsaved changes?", NULL, NULL, NULL)) { break; } else { return; } } } gapp_free(gapp); exit(0); }
/* * Warn about a possible bug displaying the passed message, try to save * any unsaved work and abort */ void emergency_exit(GraceApp *gapp, int is_my_bug, char *msg) { /* * Since we got so far, memory is probably corrupted so it's better to use * a static storage */ static char buf[GR_MAXPATHLEN]; int i; if (gapp->rt->emergency_save != FALSE) { /* don't mind signals anymore: we're in emergency save mode already */ gapp->rt->interrupts++; if (gapp->rt->interrupts > 10) { fprintf(stderr, "oh, no luck :-(\n"); please_report_the_bug(); abort(); } return; } else { gapp->rt->emergency_save = TRUE; gapp->rt->interrupts = 0; fprintf(stderr, "\a\nOops! %s\n", msg); for (i = 0; i < gapp->gpcount; i++) { if (gapp->gplist[i] && quark_dirtystate_get(gproject_get_top(gapp->gplist[i]))) { strcpy(buf, gproject_get_docname(gapp->gplist[i])); strcat(buf, "$"); fprintf(stderr, "Trying to save your work into file \"%s\"... ", buf); fflush(stderr); gapp->gui->noask = TRUE; if (save_project(gapp->gplist[i], buf) == RETURN_SUCCESS) { fprintf(stderr, "ok!\n"); } else { fprintf(stderr, "oh, no luck :-(\n"); } } } if (is_my_bug) { please_report_the_bug(); } abort(); } }
char *q_labeling(Quark *q) { Grace *grace = grace_from_quark(q); char *buf; tickmarks *t; DObject *o; region *r; if (!q) { return NULL; } buf = xmalloc(strlen(QIDSTR(q)) + 128); if (!buf) { return NULL; } switch (quark_fid_get(q)) { case QFlavorProject: sprintf(buf, "Project \"%s%s\"", QIDSTR(q), quark_dirtystate_get(q) ? "*":""); break; case QFlavorSSD: sprintf(buf, "SpreadSheet \"%s%s\"", QIDSTR(q), quark_dirtystate_get(q) ? "*":""); break; case QFlavorFrame: sprintf(buf, "Frame \"%s%s\"", QIDSTR(q), quark_dirtystate_get(q) ? "*":""); break; case QFlavorGraph: sprintf(buf, "Graph \"%s%s\" (type: %s)", QIDSTR(q), quark_dirtystate_get(q) ? "*":"", graph_types(grace, graph_get_type(q))); break; case QFlavorSet: sprintf(buf, "Set \"%s%s\" (%s)", QIDSTR(q), quark_dirtystate_get(q) ? "*":"", set_types(grace, set_get_type(q))); break; case QFlavorAGrid: t = axisgrid_get_data(q); sprintf(buf, "%c AGrid \"%s%s\"", t->type == AXIS_TYPE_X ? 'X':'Y', QIDSTR(q), quark_dirtystate_get(q) ? "*":""); break; case QFlavorAxis: t = axisgrid_get_data(q); sprintf(buf, "Axis \"%s%s\"", QIDSTR(q), quark_dirtystate_get(q) ? "*":""); break; case QFlavorDObject: o = object_get_data(q); sprintf(buf, "%s \"%s%s\"", object_type_descr(grace, o->type), QIDSTR(q), quark_dirtystate_get(q) ? "*":""); break; case QFlavorAText: sprintf(buf, "AText \"%s%s\"", QIDSTR(q), quark_dirtystate_get(q) ? "*":""); break; case QFlavorRegion: r = region_get_data(q); sprintf(buf, "Region \"%s%s\" (%d pts)", QIDSTR(q), quark_dirtystate_get(q) ? "*":"", r->n); break; default: sprintf(buf, "??? \"%s%s\"", QIDSTR(q), quark_dirtystate_get(q) ? "*":""); break; } return buf; }