📄 draw.c
字号:
/* $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 + -