0853
|
ScianEvents.c,
ScianFixedClasses.h,
ScianFontSystem.c,
ScianGaryFiles.c,
ScianGeoBrush.h,
ScianHwuFiles.c,
ScianIcons.c,
ScianIcons.h,
ScianMain.c,
ScianObjFunctions.c,
ScianPictures.c,
ScianSpaces.c,
ScianVisMesh.c,
ScianVisObjects.c,
ScianWindowFunctions.c,
ScianWindowFunctions.h,
ScianWindows.c,
machine.h,
|
|
|
/*ScianIcons.c
Eric Pepke
March 22, 1990
Does icon stuff in scian
Added PostScript output to DrawIcon, 8/25/92, JEL
*/
#include "Scian.h"
#include "ScianTypes.h"
#include "ScianIcons.h"
#include "ScianColors.h"
#include "ScianArrays.h"
#include "ScianErrors.h"
#include "ScianLists.h"
#include "ScianIDs.h"
#include "ScianEvents.h"
#include "ScianControls.h"
#include "ScianScripts.h"
#include "ScianStyle.h"
#include "ScianDraw.h"
#include "ScianTextBoxes.h"
#include "ScianFontSystem.h"
#ifdef GRAPHICS
#include "ScianIconFonts.h"
#endif
ObjPtr iconClass = 0;
int iconXOff, iconYOff; /*Offsets for icons on dragging*/
#define COLORICONXOFFSET -5 /*X offset for color icon*/
#define COLORICONYOFFSET 0 /*Y offset for color icon*/
#define NRAINBOWCOLORS 5
int rainbowColor[NRAINBOWCOLORS] =
{
UIRED,
UIYELLOW,
UIGREEN,
UICYAN,
UIBLUE
};
static ObjPtr ColorIconExtraDraw(object, x, y)
ObjPtr object;
int x, y;
/*Draws extra stuff for a color icon*/
{
#ifdef GRAPHICS
short bx, by, ex, ey, k;
bx = x + COLORICONXOFFSET;
by = y + COLORICONYOFFSET;
ex = x + ICONSIZE / 2;
ey = by - (ex - bx) / 2;
for (k = 0; k < NRAINBOWCOLORS; ++k)
{
SetUIColor(rainbowColor[k]);
FillTri(bx, by, ex, ey, ex, ey + (ex - bx) / (NRAINBOWCOLORS - 1));
ey += (ex - bx) / (NRAINBOWCOLORS - 1);
}
#endif
}
#ifdef HAVE_PROTOTYPES
void DrawIcon(int x, int y, int whichIcon, char *iconTitle, char *subTitle, int backColor, int flags)
#else
void DrawIcon(x, y, whichIcon, iconTitle, subTitle, backColor, flags)
int x, y, whichIcon;
char *iconTitle;
char *subTitle;
int backColor;
int flags;
#endif
/*Draw icon whichIcon with its center at x, y with title
iconTitle. If iconTitle is NIL, doesn't draw a title.
Draws the background of the color in UIcolor backColor.
Flags tells what parts to draw.
*/
{
#ifdef GRAPHICS
Icoord v[4][2];
char s[2];
int texty;
int k;
int iconFont, iconChar, iconIndex;
int fontSize;
s[1] = '\0';
/*Get the icon font and character*/
iconFont = iconFontLocationTable[whichIcon - 32][0];
iconChar = iconFontLocationTable[whichIcon - 32][1];
if (drawingMode == DRAW_SCREEN)
{
font(ICONBEGFONTS + iconFont);
}
else if (drawingMode == DRAW_POSTSCRIPT && psFile)
{
RegisterFontUsed("icons");
if ((iconIndex = RegisterIconUsed(whichIcon)) < 0) return;
if (strcmp("icons", curFontName) != 0)
{
fprintf(psFile,"/icons findfont 32 scalefont setfont\n");
strcpy(curFontName, "icons"); /* remember this */
curFontSize = 32;
}
}
if (flags & DI_DRAWSHADOW)
{
SetUIColor(UISHADOW);
if (drawingMode == DRAW_SCREEN)
{
cmov2i(x - ICONSIZE / 2, y - ICONSIZE / 2 - ICONSHADOW);
s[0] = iconChar + 2;
charstr(s);
}
else if (drawingMode == DRAW_POSTSCRIPT && psFile)
{
fprintf(psFile, "%f setgray\n", PSColor());
s[0] = 32 + 3*iconIndex + 2;
fprintf(psFile,"%d %d moveto (%s) show\n",
x - ICONSIZE/2, y - ICONSIZE/2 - ICONSHADOW, PSShow(s));
}
}
for (k = 0; k >= 0; --k)
{
if (flags & DI_DRAWBACK)
{
SetUIColor(k ? UIICONGREYBACK : backColor);
if (drawingMode == DRAW_SCREEN)
{
cmov2i(x - ICONSIZE / 2 + k * 2, y - ICONSIZE / 2 + k * 2);
s[0] = iconChar + 1;
charstr(s);
}
else if (drawingMode == DRAW_POSTSCRIPT && psFile)
{
fprintf(psFile, "%f setgray\n", PSColor());
s[0] = 32 + 3*iconIndex + 1;
fprintf(psFile,"%d %d moveto (%s) show\n",
x - ICONSIZE/2 + k*2, y - ICONSIZE/2 + k*2, PSShow(s));
}
}
if (flags & DI_DRAWFORE)
{
if (flags & DI_GREY || k)
{
SetUIColor(UIICONGREYFORE);
}
else
{
SetUIColor(UIICONFORE);
}
if (drawingMode == DRAW_SCREEN)
{
cmov2i(x - ICONSIZE / 2 + k * 2, y - ICONSIZE / 2 + k * 2);
s[0] = iconChar;
charstr(s);
}
else if (drawingMode == DRAW_POSTSCRIPT && psFile)
{
fprintf(psFile, "%f setgray\n", PSColor());
s[0] = 32 + 3*iconIndex;
fprintf(psFile,"%d %d moveto (%s) show\n",
x - ICONSIZE/2 + k*2, y - ICONSIZE/2 + k*2, PSShow(s));
}
}
}
texty = y - ICONSIZE / 2 - (flags & DI_DRAWSHADOW ? ICONSHADOW : 0) - ICONTEXTOFFSET;
if (iconTitle)
{
char *s, *s2;
SetUIColor(UITEXT);
fontSize = flags & DI_SMALLTEXT ? ICONTEXTSMALLSIZE : ICONTEXTSIZE;
SetUIFont(flags & DI_SMALLTEXT ? UIICONSUBFONT : UIICONFONT);
s = iconTitle;
s2 = tempStr;
while (*s)
{
if (*s == '\n')
{
*s2 = 0;
++s;
s2 = tempStr;
DrawAString(CENTERALIGN, x,
texty,
tempStr);
texty -= (fontSize);
}
else
{
*s2 = *s;
++s;
++s2;
}
}
*s2 = 0;
DrawAString(CENTERALIGN, x,
texty,
tempStr);
if (subTitle)
{
texty -= (fontSize + 2);
SetUIColor(UITEXT);
SetUIFont(UIICONSUBFONT);
DrawAString(CENTERALIGN, x,
texty,
subTitle);
}
}
#endif
}
#ifdef HAVE_PROTOTYPES
void GenIconDef(FILE *outFile)
#else
void GenIconDef(outFile)
FILE *outFile;
#endif
/* output PostScript font definition for icons used in eps file */
{
#ifdef GRAPHICS
int icon, c, i, j, k;
if (!outFile || numIconsUsed < 1) return;
/* generate font def header and Encoding array */
fprintf(outFile,
"%%%%BeginFont: icons\n\
/iconfont 10 dict def\n\
iconfont begin\n\
/FontType 3 def\n\
/FontMatrix [1 0 0 1 0 0] def\n\
/FontBBox [0 0 32 32] def\n\
/Encoding 256 array def\n\
0 1 255 { Encoding exch /.notdef put } for\n\n");
for (i=0, c=32; i} def\n");
fprintf(outFile, "\t\t/back%02d\n\t\t{<\n\t\t", i);
for (k=0; k<4; ++k)
{
for (j=0; j<16; ++j)
fprintf(outFile,"%04X",*p++);
fprintf(outFile,"\n\t\t");
}
fprintf(outFile, ">} def\n");
fprintf(outFile, "\t\t/shad%02d\n\t\t{<\n\t\t", i);
for (k=0; k<4; ++k)
{
for (j=0; j<16; ++j)
fprintf(outFile,"%04X",*p++);
fprintf(outFile,"\n\t\t");
}
fprintf(outFile, ">} def\n\n");
}
/* generate font def trailer */
fprintf(outFile,
" end %%CharProcs\n\
\n\
/BuildChar\n\
{\n\
32 0 0 0 32 32 setcachedevice\n\
exch begin %%icon font dict\n\
Encoding exch get %%get icon index\n\
CharProcs exch get %%get icon name\n\
end\n\
32 32\n\
true\n\
[32 0 0 32 0 0]\n\
5 -1 roll %%get name back on top\n\
exec %%get bits\n\
imagemask %%draw it\n\
} def\n\
\n\
end %%iconfont\n\
\n\
/icons iconfont definefont pop\n\
%%%%EndFont\n\n");
#endif
return;
}
#ifdef HAVE_PROTOTYPES
void DrawIconGhost(ObjPtr icon, int xDisp, int yDisp)
#else
void DrawIconGhost(icon, xDisp, yDisp)
ObjPtr icon;
int xDisp, yDisp;
#endif
/*Draw a ghost of icon icon, displacint its center by xDisp, yDisp.*/
{
#ifdef GRAPHICS
Icoord v[4][2];
char s[2];
ObjPtr theName, whichIconInt, theLoc;
int x, y;
real loc[2];
int whichIcon;
char *name;
int iconFont, iconChar;
theName = GetVar(icon, NAME);
if (IsString(theName))
{
name = GetString(theName);
}
else
{
name = 0;
}
whichIconInt = GetVar(icon, WHICHICON);
if (whichIconInt && IsInt(whichIconInt))
{
whichIcon = GetInt(whichIconInt);
}
else
{
return;
}
theLoc = GetFixedArrayVar("DrawIconGhost", icon, ICONLOC, 1, 2L);
if (!theLoc)
{
return;
}
Array2CArray(loc, theLoc);
x = loc[0] + xDisp;
y = loc[1] + yDisp;
iconFont = iconFontLocationTable[whichIcon - 32][0];
iconChar = iconFontLocationTable[whichIcon - 32][1];
font(ICONBEGFONTS + iconFont);
s[1] = 0;
s[0] = iconChar;
cmov2i(x - ICONSIZE / 2, y - ICONSIZE / 2);
charstr(s);
if (name)
{
SetUIFont(UIICONFONT);
DrawAString(CENTERALIGN, x,
y - ICONSIZE / 2 - ICONSHADOW - ICONTEXTOFFSET,
name);
}
#endif
}
ObjPtr IconBoundsInvalid(icon, changeCount)
ObjPtr icon;
unsigned long changeCount;
/*Returns invalid bounds of icon*/
{
ObjPtr var;
MakeVar(icon, APPEARANCE);
if (GetVarChangeCount(icon, CHANGEDBOUNDS) > changeCount)
{
real loc[2], bounds[4];
var = GetVar(icon, ICONLOC);
if (!var)
{
return ObjTrue;
}
Array2CArray(loc, var);
bounds[0] = loc[0] - ICONSIZE / 2 - 1 - ICONINVALEXTRA;
bounds[1] = loc[0] + ICONSIZE / 2 + 1;
bounds[2] = loc[1] - ICONSIZE / 2 - 1;
bounds[3] = loc[1] + ICONSIZE / 2 + 1 + ICONINVALEXTRA;
MakeVar(icon, NAME);
if (GetVarChangeCount(icon, NAME) > changeCount)
{
ObjPtr name, oldName;
int w1, w2, w;
SetUIFont(UIICONFONT);
name = GetVar(icon, NAME);
if (name)
{
w1 = StrWidth(GetString(name));
}
else
{
w1 = 0;
}
name = GetVar(icon, OLDNAME);
if (name)
{
w2 = StrWidth(GetString(name));
}
else
{
w2 = 0;
}
w = MAX(w1, w2);
if (w > 0)
{
int m;
m = ((int) (bounds[0] + bounds[1])) / 2;
bounds[2] -= ICONSHADOW + ICONTEXTOFFSET + 6;
bounds[0] = MIN(bounds[0], m - 2 - w/2);
bounds[1] = MAX(bounds[1], m + 2 + w/2);
}
}
MakeVar(icon, FORMAT);
if (GetVarChangeCount(icon, FORMAT) > changeCount)
{
ObjPtr name, oldName;
int w1, w2, w;
SetUIFont(UIICONSUBFONT);
name = GetVar(icon, FORMAT);
if (name)
{
w1 = StrWidth(GetString(name));
}
else
{
w1 = 0;
}
name = GetVar(icon, OLDFORMAT);
if (name)
{
w2 = StrWidth(GetString(name));
}
else
{
w2 = 0;
}
w = MAX(w1, w2);
if (w > 0)
{
int m;
m = ((int) (bounds[0] + bounds[1])) / 2;
bounds[2] -= 12;
bounds[0] = MIN(bounds[0], m - 2 - w/2);
bounds[1] = MAX(bounds[1], m + 2 + w/2);
}
}
var = NewRealArray(1, 4L);
CArray2Array(var, bounds);
return var;
}
else
{
return NULLOBJ;
}
}
ObjPtr DrawIconObj(object)
ObjPtr object;
/*Draws this icon thing*/
{
#ifdef GRAPHICS
ObjPtr theLoc;
ObjPtr theName;
char *title, *subTitle;
ObjPtr whichIconInt;
real loc[2];
int whichIcon;
FuncTyp method;
ObjPtr repObj;
Bool isGreyed;
int backColor;
ObjPtr var;
theLoc = GetFixedArrayVar("DrawIconObj", object, ICONLOC, 1, 2L);
if (!theLoc)
{
return NULLOBJ;
}
MakeVar(object, NAME);
theName = GetVar(object, NAME);
if (theName && IsString(theName))
{
title = GetString(theName);
}
else
{
title = (char *) 0;
}
MakeVar(object, FORMAT);
theName = GetVar(object, FORMAT);
if (theName && IsString(theName))
{
subTitle = GetString(theName);
}
else
{
subTitle = (char *) 0;
}
whichIconInt = GetVar(object, WHICHICON);
if (whichIconInt && IsInt(whichIconInt))
{
whichIcon = GetInt(whichIconInt);
}
else
{
whichIcon = ICONQUESTION;
}
Array2CArray(loc, theLoc);
MakeVar(object, ICONGREYED);
isGreyed = GetPredicate(object, ICONGREYED);
var = GetVar(object, BACKGROUND);
if (var)
{
backColor = GetInt(var);
}
else
{
backColor = UIICONBACK;
}
repObj = GetVar(object, REPOBJ);
DrawIcon((int) loc[0], (int) loc[1], whichIcon,
title, subTitle,
IsSelected(repObj ? repObj : object) ? UIICONSELBACK :
(isGreyed ? UIICONGREYBACK : backColor),
DI_DRAWFORE | DI_DRAWBACK | DI_DRAWSHADOW |
(GetPredicate(repObj, TEMPLATEP) ? DI_TEMPLATE : 0) |
(isGreyed ? DI_GREY : 0));
method = GetMethod(object, ICONEXTRADRAW);
if (method)
{
(*method)(object, (int) loc[0], (int) loc[1]);
}
#endif
return ObjTrue;
}
ObjPtr NewIcon(x, y, whichIcon, name)
int x, y;
int whichIcon;
char *name;
/*Makes and returns a new icon of type whichIcon and name name*/
{
ObjPtr retVal;
retVal = NewObject(iconClass, 0);
if (whichIcon == ICONCOLOR)
{
SetMethod(retVal, ICONEXTRADRAW, ColorIconExtraDraw);
}
if (retVal)
{
real loc[2];
ObjPtr locArray;
loc[0] = x;
loc[1] = y;
locArray = NewRealArray(1, (long) 2);
if (locArray)
{
CArray2Array(locArray, loc);
SetVar(retVal, ICONLOC, locArray);
}
SetVar(retVal, WHICHICON, NewInt(whichIcon));
if (name)
{
SetVar(retVal, NAME, NewString(name));
}
}
return retVal;
}
ObjPtr MakeIconGreyed(icon)
ObjPtr icon;
/*Makes an icon greyed or not*/
{
ObjPtr repObj;
repObj = GetVar(icon, REPOBJ);
if (repObj)
{
SetVar(icon, ICONGREYED, GetVar(repObj, HIDDEN));
}
else
{
SetVar(icon, ICONGREYED, ObjFalse);
}
}
static ObjPtr MakeIconAppearance(icon)
ObjPtr icon;
/*Dummy make for icon appearance*/
{
SetVar(icon, APPEARANCE, ObjTrue);
ImInvalid(icon);
return ObjTrue;
}
static ObjPtr MakeIconName(icon)
ObjPtr icon;
/*Makes an icon's name from its REPOBJ*/
{
ObjPtr repObj;
MakeVar(icon, REPOBJ);
repObj = GetVar(icon, REPOBJ);
if (repObj)
{
SetVar(icon, OLDNAME, GetVar(icon, NAME));
SetVar(icon, NAME, GetVar(repObj, NAME));
ImInvalid(icon);
}
else
{
SetVar(icon, NAME, GetVar(icon, NAME));
}
return ObjTrue;
}
static ObjPtr MakeIconFormat(icon)
ObjPtr icon;
/*Makes an icon's format from its REPOBJ*/
{
ObjPtr repObj;
MakeVar(icon, REPOBJ);
repObj = GetVar(icon, REPOBJ);
if (repObj)
{
SetVar(icon, OLDFORMAT, GetVar(icon, FORMAT));
SetVar(icon, FORMAT, GetVar(repObj, FORMAT));
ImInvalid(icon);
}
else
{
SetVar(icon, FORMAT, GetVar(icon, FORMAT));
}
return ObjTrue;
}
void InitIcons()
{
iconClass = NewObject(screenClass, 0);
AddToReferenceList(iconClass);
SetVar(iconClass, CLASSID, NewInt(CLASS_ICON));
SetMethod(iconClass, DRAW, DrawIconObj);
SetVar(iconClass, TYPESTRING, NewString("icon"));
DeclareIndirectDependency(iconClass, ICONGREYED, REPOBJ, HIDDEN);
SetMethod(iconClass, ICONGREYED, MakeIconGreyed);
DeclareIndirectDependency(iconClass, APPEARANCE, REPOBJ, SELECTED);
DeclareIndirectDependency(iconClass, APPEARANCE, REPOBJ, HIDDEN);
DeclareDependency(iconClass, APPEARANCE, NAME);
DeclareDependency(iconClass, APPEARANCE, FORMAT);
DeclareIndirectDependency(iconClass, NAME, REPOBJ, NAME);
DeclareIndirectDependency(iconClass, FORMAT, REPOBJ, FORMAT);
SetMethod(iconClass, APPEARANCE, MakeIconAppearance);
SetMethod(iconClass, BOUNDSINVALID, IconBoundsInvalid);
SetMethod(iconClass, NAME, MakeIconName);
SetMethod(iconClass, FORMAT, MakeIconFormat);
SetVar(iconClass, REPOBJONLY, ObjTrue);
}
void DefineIconFonts()
/*Initializes the icon system*/
{
int i;
#ifdef GRAPHICS
for (i = 0; i < NICONFONTS; ++i)
{
defrasterfont(ICONBEGFONTS + i,
iconFontParameters[i] . ht,
iconFontParameters[i] . nc,
iconFontParameters[i] . chars,
iconFontParameters[i] . rs,
(void *) iconFontParameters[i] . rasters);
/*Have to use (void *) cast to make compatible both
with SGI and IBM*/
}
#endif
}
void KillIcons()
/*Kills the icons*/
{
DeleteThing(iconClass);
}
|