⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 garray.c

📁 Graphviz - Graph Drawing Programs from AT&T Research and Lucent Bell Labs See doc/build.html for
💻 C
字号:
/* $Id: garray.c,v 1.3 2006/06/27 12:43:47 ellson Exp $ $Revision: 1.3 $ *//* vim:set shiftwidth=4 ts=8: *//***********************************************************      This software is part of the graphviz package      **                http://www.graphviz.org/                 **                                                         **            Copyright (c) 1994-2004 AT&T Corp.           **                and is licensed under the                **            Common Public License, Version 1.0           **                      by AT&T Corp.                      **                                                         **        Information and Software Systems Research        **              AT&T Research, Florham Park NJ             ***********************************************************//* Lefteris Koutsofios - AT&T Labs Research */#include "common.h"#include "g.h"#include "gcommon.h"#include "mem.h"#define WAU widget->u.aint GAcreatewidget (    Gwidget_t *parent, Gwidget_t *widget, int attrn, Gwattr_t *attrp) {    PIXsize_t ps;    DWORD wflags;    int mode, ai;    if (!parent) {        Gerr (POS, G_ERRNOPARENTWIDGET);        return -1;    }    wflags = WS_CHILDWINDOW;    mode = G_AWVARRAY;    WAU->func = NULL;    ps.x = ps.y = MINAWSIZE;    for (ai = 0; ai < attrn; ai++) {        switch (attrp[ai].id) {        case G_ATTRSIZE:            GETSIZE (attrp[ai].u.s, ps, MINAWSIZE);            break;        case G_ATTRBORDERWIDTH:            wflags |= WS_BORDER;            break;        case G_ATTRMODE:            if (strcmp ("horizontal", attrp[ai].u.t) == 0)                mode = G_AWHARRAY;            else if (strcmp ("vertical", attrp[ai].u.t) == 0)                mode = G_AWVARRAY;            else {                Gerr (POS, G_ERRBADATTRVALUE, attrp[ai].u.t);                return -1;            }            break;        case G_ATTRLAYOUT:            if (strcmp ("on", attrp[ai].u.t) == 0) {                Gawsetmode (widget, FALSE);                WAU->mode = G_AWHARRAY;            } else if (strcmp ("off", attrp[ai].u.t) == 0) {                Gawsetmode (widget, TRUE);                WAU->mode = G_AWHARRAY;            } else {                Gerr (POS, G_ERRBADATTRVALUE, attrp[ai].u.t);                return -1;            }            break;        case G_ATTRWINDOWID:            Gerr (POS, G_ERRCANNOTSETATTR1, "windowid");            return -1;        case G_ATTRRESIZECB:            WAU->func = attrp[ai].u.func;            break;        case G_ATTRUSERDATA:            widget->udata = attrp[ai].u.u;            break;        default:            Gerr (POS, G_ERRBADATTRID, attrp[ai].id);            return -1;        }    }    Gawinitialize (widget, mode);    Gadjustwrect (parent, &ps);    if (!(widget->w = CreateWindow (        "ArrayClass", "array", wflags, 0, 0, ps.x,        ps.y, parent->w, (HMENU) (widget - &Gwidgets[0]),        hinstance, NULL    ))) {        Gerr (POS, G_ERRCANNOTCREATEWIDGET);        return -1;    }    ShowWindow (widget->w, SW_SHOW);    UpdateWindow (widget->w);    if (parent && parent->type == G_ARRAYWIDGET)        Gawinsertchild (parent, widget);    return 0;}int GAsetwidgetattr (Gwidget_t *widget, int attrn, Gwattr_t *attrp) {    Gwidget_t *parent;    PIXsize_t ps;    DWORD wflags1;    int ai;    parent = (widget->pwi == -1) ? NULL : &Gwidgets[widget->pwi];    wflags1 = SWP_NOMOVE | SWP_NOZORDER;    for (ai = 0; ai < attrn; ai++) {        switch (attrp[ai].id) {        case G_ATTRSIZE:            GETSIZE (attrp[ai].u.s, ps, MINAWSIZE);/*            Gadjustwrect (parent, &ps);*/            SetWindowPos (widget->w, (HWND) NULL, 0, 0, ps.x, ps.y, wflags1);            break;        case G_ATTRBORDERWIDTH:            Gerr (POS, G_ERRCANNOTSETATTR2, "borderwidth");            return -1;        case G_ATTRMODE:            Gerr (POS, G_ERRCANNOTSETATTR2, "mode");            return -1;        case G_ATTRLAYOUT:            if (strcmp ("on", attrp[ai].u.t) == 0)                Gawsetmode (widget, FALSE);            else if (strcmp ("off", attrp[ai].u.t) == 0)                Gawsetmode (widget, TRUE);            else {                Gerr (POS, G_ERRBADATTRVALUE, attrp[ai].u.t);                return -1;            }            break;        case G_ATTRWINDOWID:            Gerr (POS, G_ERRCANNOTSETATTR2, "windowid");            return -1;        case G_ATTRRESIZECB:            WAU->func = attrp[ai].u.func;            break;        case G_ATTRUSERDATA:            widget->udata = attrp[ai].u.u;            break;        default:            Gerr (POS, G_ERRBADATTRID, attrp[ai].id);            return -1;        }    }    return 0;}int GAgetwidgetattr (Gwidget_t *widget, int attrn, Gwattr_t *attrp) {    RECT r;    int ai;    for (ai = 0; ai < attrn; ai++) {        switch (attrp[ai].id) {        case G_ATTRSIZE:            GetWindowRect (widget->w, &r);            attrp[ai].u.s.x = r.right - r.left;            attrp[ai].u.s.y = r.bottom - r.top;            break;        case G_ATTRBORDERWIDTH:            Gerr (POS, G_ERRCANNOTGETATTR, "borderwidth");            return -1;        case G_ATTRMODE:            attrp[ai].u.t = (                WAU->mode == G_AWHARRAY            ) ? "horizontal" : "vertical";            break;        case G_ATTRLAYOUT:            attrp[ai].u.t = (Gawgetmode (widget)) ? "off" : "on";            break;        case G_ATTRWINDOWID:            sprintf (&Gbufp[0], "0x%lx", widget->w);            attrp[ai].u.t = &Gbufp[0];            break;        case G_ATTRRESIZECB:            attrp[ai].u.func = WAU->func;            break;        case G_ATTRUSERDATA:            attrp[ai].u.u = widget->udata;            break;        default:            Gerr (POS, G_ERRBADATTRID, attrp[ai].id);            return -1;        }    }    return 0;}int GAdestroywidget (Gwidget_t *widget) {    Gwidget_t *parent;    parent = (widget->pwi == -1) ? NULL : &Gwidgets[widget->pwi];    if (parent && parent->type == G_ARRAYWIDGET)        Gawdeletechild (parent, widget);    Gawdestroy (widget);    DestroyWindow (widget->w);    return 0;}/* the rest of this file contains the implementation of the array widget */static void dolayout (Gwidget_t *, int);int Gaworder (Gwidget_t *widget, void *data, Gawordercb func) {    (*func) (data, &WAU->data);    dolayout (widget, TRUE);    return 0;}int Gawsetmode (Gwidget_t *widget, int mode) {    WAU->data.batchmode = mode;    dolayout (widget, TRUE);    return 0;}int Gawgetmode (Gwidget_t *widget) {    return WAU->data.batchmode;}void Gawdefcoordscb (int wi, Gawdata_t *dp) {    Gawcarray_t *cp;    int sx, sy, csx, csy, ci;    sx = dp->sx, sy = dp->sy;    csx = csy = 0;    for (ci = 0; ci < dp->cj; ci++) {        cp = &dp->carray[ci];        if (!cp->flag)            continue;        cp->ox = csx, cp->oy = csy;        if (dp->type == G_AWVARRAY)            cp->sx = sx - 2 * cp->bs, csy += cp->sy + 2 * cp->bs;        else            cp->sy = sy - 2 * cp->bs, csx += cp->sx + 2 * cp->bs;    }    if (dp->type == G_AWVARRAY)        dp->sy = csy;    else        dp->sx = csx;}void Gawinitialize (Gwidget_t *widget, int mode) {    WAU->data.type = mode;    if (!(WAU->data.carray = Marrayalloc ((long) AWCARRAYINCR * AWCARRAYSIZE)))        panic1 (POS, "Gawinitialize", "cannot allocate carray");    WAU->data.cn = AWCARRAYINCR;    WAU->data.cj = 0;    WAU->data.batchmode = FALSE;    WAU->data.working = FALSE;}void Gawdestroy (Gwidget_t *widget) {    Marrayfree (WAU->data.carray);    WAU->data.cn = WAU->data.cj = 0;}void Gawresize (Gwidget_t *widget) {    dolayout (widget, FALSE);}void Gawinsertchild (Gwidget_t *parent, Gwidget_t *child) {    if (parent->u.a->data.cj == parent->u.a->data.cn) {        parent->u.a->data.carray = Marraygrow (            parent->u.a->data.carray,            (long) (parent->u.a->data.cn + AWCARRAYINCR) * AWCARRAYSIZE        );        parent->u.a->data.cn += AWCARRAYINCR;    }    parent->u.a->data.carray[parent->u.a->data.cj++].w = child->w;    dolayout (parent, TRUE);}void Gawdeletechild (Gwidget_t *parent, Gwidget_t *child) {    int ci;    for (ci = 0; ci < parent->u.a->data.cj; ci++)        if (parent->u.a->data.carray[ci].w == child->w)            break;    if (ci < parent->u.a->data.cj) {        for (; ci + 1 < parent->u.a->data.cj; ci++)            parent->u.a->data.carray[ci].w = parent->u.a->data.carray[ci + 1].w;        parent->u.a->data.cj--;        dolayout (parent, TRUE);    }}static void dolayout (Gwidget_t *widget, int flag) {    Gawdata_t *dp;    Gawcarray_t *cp;    RECT r;    int sx, sy, ci;    if (WAU->data.batchmode || WAU->data.working)        return;    WAU->data.working = TRUE;    dp = &WAU->data;    for (ci = 0; ci < dp->cj; ci++) {        cp = &dp->carray[ci];        GetWindowRect (cp->w, &r);        cp->flag = 1;        cp->ox = 0;        cp->oy = 0;        cp->sx = r.right - r.left;        cp->sy = r.bottom - r.top;        cp->bs = 0;    }    GetClientRect (widget->w, &r);    dp->sx = r.right - r.left, dp->sy = r.bottom - r.top;    if (WAU->func)        (*WAU->func) (widget - &Gwidgets[0], dp);    else        Gawdefcoordscb (widget - &Gwidgets[0], dp);    if ((sx = dp->sx) < MINAWSIZE)        sx = MINAWSIZE;    if ((sy = dp->sy) < MINAWSIZE)        sy = MINAWSIZE;    if (flag && (r.right - r.left != sx || r.bottom - r.top != sy)) {        sx -= (r.right - r.left);        sy -= (r.bottom - r.top);        GetWindowRect (widget->w, &r);        sx += (r.right - r.left);        sy += (r.bottom - r.top);        SetWindowPos (            widget->w, (HWND) NULL, 0, 0, sx, sy, SWP_NOMOVE | SWP_NOZORDER        );    }    for (ci = 0; ci < dp->cj; ci++) {        cp = &dp->carray[ci];        SetWindowPos (            cp->w, (HWND) NULL, cp->ox, cp->oy, cp->sx, cp->sy, SWP_NOZORDER        );    }    WAU->data.working = FALSE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -