示例#1
0
文件: explorer.c 项目: mariusal/grace
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);
}
示例#2
0
文件: files.c 项目: astrotycoon/grace
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;
    }
}
示例#3
0
/*
 * 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);
}
示例#4
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();
    }
}
示例#5
0
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;
}