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

📄 draw.c

📁 Graphviz - Graph Drawing Programs from AT&T Research and Lucent Bell Labs See doc/build.html for
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $Id: Draw.c,v 1.5 2005/11/13 01:35:10 ellson Exp $ $Revision: 1.5 $ *//* 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             ***********************************************************/#ifdef FEATURE_CS#include <ast.h>#endif/* * Copyright 1989 Software Research Associates, Inc., Tokyo, Japan * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Software Research Associates not be used * in advertising or publicity pertaining to distribution of the software * without specific, written prior permission.  Software Research Associates * makes no representations about the suitability of this software for any * purpose.  It is provided "as is" without express or implied warranty. * * SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * * Author: Erik M. van der Poel *         Software Research Associates, Inc., Tokyo, Japan *         erik@sra.co.jp */#include <stdio.h>#include "SFinternal.h"#include "xstat.h"#include <X11/StringDefs.h>#include <X11/Xaw/Scrollbar.h>#include <X11/Xaw/Cardinals.h>#include "SFDecls.h"#define SF_DEFAULT_FONT "9x15"#ifdef ABS#undef ABS#endif#define ABS(x) (((x) < 0) ? (-(x)) : (x))#ifdef HAVE_INTPTR_T#define INT2PTR(t,v) ((t)(intptr_t)(v))#define PTR2INT(v) ((Sflong_t)(intptr_t)(v))#else#define INT2PTR(t,v) ((t)(v))#define PTR2INT(v) ((Sflong_t)(v))#endiftypedef struct {    char *fontname;} TextData, *textPtr;int SFcharWidth, SFcharAscent, SFcharHeight;int SFcurrentInvert[3] = { -1, -1, -1 };static GC SFlineGC, SFscrollGC, SFinvertGC, SFtextGC;static XtResource textResources[] = {    {        XtNfont, XtCFont, XtRString, sizeof (char *),        XtOffset (textPtr, fontname), XtRString, SF_DEFAULT_FONT    },};static XFontStruct *SFfont;static int SFcurrentListY;static XtIntervalId SFscrollTimerId;void SFinitFont (void) {    TextData    *data;    data = XtNew (TextData);    XtGetApplicationResources (        selFileForm, (XtPointer) data, textResources,        XtNumber (textResources), (Arg *) NULL, ZERO    );    SFfont = XLoadQueryFont (SFdisplay, data->fontname);    if (!SFfont) {        SFfont = XLoadQueryFont (SFdisplay, SF_DEFAULT_FONT);        if (!SFfont) {            char sbuf[256];            sprintf (sbuf, "XsraSelFile: can't get font %s", SF_DEFAULT_FONT);            XtAppError (SFapp, sbuf);        }    }    SFcharWidth = (SFfont->max_bounds.width + SFfont->min_bounds.width) / 2;    SFcharAscent = SFfont->max_bounds.ascent;    SFcharHeight = SFcharAscent + SFfont->max_bounds.descent;}void SFcreateGC (void) {    XGCValues  gcValues;    XRectangle rectangles[1];    gcValues.foreground = SFfore;    SFlineGC = XtGetGC (selFileLists[0], GCForeground, &gcValues);    SFscrollGC = XtGetGC (selFileLists[0], 0, &gcValues);    gcValues.function = GXinvert;    gcValues.plane_mask = (SFfore ^ SFback);    SFinvertGC = XtGetGC (selFileLists[0], GCFunction | GCPlaneMask, &gcValues);    gcValues.foreground = SFfore;    gcValues.background = SFback;    gcValues.font = SFfont->fid;    SFtextGC = XCreateGC (        SFdisplay, XtWindow (selFileLists[0]),        GCForeground | GCBackground | GCFont, &gcValues    );    rectangles[0].x = SFlineToTextH + SFbesideText;    rectangles[0].y = 0;    rectangles[0].width = SFcharsPerEntry * SFcharWidth;    rectangles[0].height = SFupperY + 1;    XSetClipRectangles (SFdisplay, SFtextGC, 0, 0, rectangles, 1, Unsorted);}void SFclearList (int n, int doScroll) {    SFDir *dir;    SFcurrentInvert[n] = -1;    XClearWindow (SFdisplay, XtWindow (selFileLists[n]));    XDrawSegments (SFdisplay, XtWindow (selFileLists[n]), SFlineGC, SFsegs, 2);    if (doScroll) {        dir = &(SFdirs[SFdirPtr + n]);        if ((SFdirPtr + n < SFdirEnd) && dir->nEntries && dir->nChars) {            XawScrollbarSetThumb (                selFileVScrolls[n],                (float) (((double) dir->vOrigin) / dir->nEntries),                (float) (((double) ((                    dir->nEntries < SFlistSize                ) ? dir->nEntries : SFlistSize)) / dir->nEntries)            );            XawScrollbarSetThumb (                selFileHScrolls[n],                (float) (((double) dir->hOrigin) / dir->nChars),                (float) (((double) ((                    dir->nChars < SFcharsPerEntry                ) ? dir->nChars : SFcharsPerEntry)) / dir->nChars)            );        } else {            XawScrollbarSetThumb (selFileVScrolls[n], (float) 0.0, (float) 1.0);            XawScrollbarSetThumb (selFileHScrolls[n], (float) 0.0, (float) 1.0);        }    }}static void SFdeleteEntry (SFDir *dir, SFEntry *entry) {    SFEntry *e;    SFEntry *end;    int     n;    int    idx;    idx = entry - dir->entries;    if (idx < dir->beginSelection) {        dir->beginSelection--;    }    if (idx <= dir->endSelection) {        dir->endSelection--;    }    if (dir->beginSelection > dir->endSelection) {        dir->beginSelection = dir->endSelection = -1;    }    if (idx < dir->vOrigin) {        dir->vOrigin--;    }    XtFree (entry->real);    end = & (dir->entries[dir->nEntries - 1]);    for (e = entry; e < end; e++) {        *e = * (e + 1);    }    if (! (--dir->nEntries)) {        return;    }    n = dir - & (SFdirs[SFdirPtr]);    if ((n < 0) || (n > 2)) {        return;    }    XawScrollbarSetThumb (        selFileVScrolls[n],        (float) (((double) dir->vOrigin) / dir->nEntries),        (float) (((double) ((            dir->nEntries < SFlistSize        ) ? dir->nEntries : SFlistSize)) / dir->nEntries)    );}static void SFwriteStatChar (char *name, int last, struct stat *statBuf) {    name[last] = SFstatChar (statBuf);}static int SFstatAndCheck (SFDir *dir, SFEntry *entry) {    struct stat statBuf;    char        save;    int         last;    /* must be restored before returning */    save = *(dir->path);    *(dir->path) = 0;    if (!SFchdir (SFcurrentPath)) {        last = strlen (entry->real) - 1;        entry->real[last] = 0;        entry->statDone = 1;        if (            (!stat (entry->real, &statBuf))#ifdef S_IFLNK            || (!lstat (entry->real, &statBuf))#endif /* ndef S_IFLNK */        ) {            if (SFfunc) {                char *shown;                shown = NULL;                if (SFfunc (entry->real, &shown, &statBuf)) {                    if (shown) {                        int len;                        len = strlen (shown);                        entry->shown = XtMalloc ((unsigned) (len + 2));                        strcpy (entry->shown, shown);                        SFwriteStatChar (entry->shown, len, &statBuf);                        entry->shown[len + 1] = 0;                    }                } else {                    SFdeleteEntry (dir, entry);                    *(dir->path) = save;                    return 1;                }            }            SFwriteStatChar (entry->real, last, &statBuf);        } else {            entry->real[last] = ' ';        }    }    *(dir->path) = save;    return 0;}static void SFdrawStrings (Window w, SFDir *dir, int from, int to) {    int     i;    SFEntry *entry;    int     x;    x = SFtextX - dir->hOrigin * SFcharWidth;    if (dir->vOrigin + to >= dir->nEntries) {        to = dir->nEntries - dir->vOrigin - 1;    }    for (i = from; i <= to; i++) {        entry = & (dir->entries[dir->vOrigin + i]);        if (! (entry->statDone)) {            if (SFstatAndCheck (dir, entry)) {                if (dir->vOrigin + to >= dir->nEntries) {                    to = dir->nEntries - dir->vOrigin - 1;                }                i--;                continue;            }        }        XDrawImageString (            SFdisplay, w, SFtextGC, x, SFtextYoffset + i * SFentryHeight,            entry->shown, strlen (entry->shown)        );        if (dir->vOrigin + i == dir->beginSelection) {            XDrawLine (                SFdisplay, w, SFlineGC, SFlineToTextH + 1,                SFlowerY + i * SFentryHeight,                SFlineToTextH + SFentryWidth - 2,                SFlowerY + i * SFentryHeight            );        }        if (            (dir->vOrigin + i >= dir->beginSelection) &&            (dir->vOrigin + i <= dir->endSelection)        ) {            SFcompletionSegs[0].y1 = SFcompletionSegs[1].y1 = (                SFlowerY + i * SFentryHeight            );            SFcompletionSegs[0].y2 = SFcompletionSegs[1].y2 = (                SFlowerY + (i + 1) * SFentryHeight - 1            );            XDrawSegments (SFdisplay, w, SFlineGC, SFcompletionSegs, 2);        }        if (dir->vOrigin + i == dir->endSelection) {            XDrawLine (                SFdisplay, w, SFlineGC,                SFlineToTextH + 1,                SFlowerY + (i + 1) * SFentryHeight - 1,                SFlineToTextH + SFentryWidth - 2,                SFlowerY + (i + 1) * SFentryHeight - 1            );        }    }}void SFdrawList (int n, int doScroll) {    SFDir  *dir;    Window w;    SFclearList (n, doScroll);    if (SFdirPtr + n < SFdirEnd) {        dir = & (SFdirs[SFdirPtr + n]);        w = XtWindow (selFileLists[n]);        XDrawImageString (            SFdisplay, w, SFtextGC,            SFtextX - dir->hOrigin * SFcharWidth,            SFlineToTextV + SFaboveAndBelowText + SFcharAscent,            dir->dir, strlen (dir->dir)        );        SFdrawStrings (w, dir, 0, SFlistSize - 1);    }}void SFdrawLists (int doScroll) {    int i;    for (i = 0; i < 3; i++) {        SFdrawList (i, doScroll);    }}static void SFinvertEntry (int n) {    XFillRectangle (        SFdisplay, XtWindow (selFileLists[n]), SFinvertGC,        SFlineToTextH, SFcurrentInvert[n] * SFentryHeight + SFlowerY,        SFentryWidth, SFentryHeight    );}static unsigned long SFscrollTimerInterval (void) {    static int maxVal = 200;

⌨️ 快捷键说明

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