mirror of
https://github.com/ctm/executor.git
synced 2025-01-08 02:33:26 +00:00
320 lines
6.8 KiB
C
320 lines
6.8 KiB
C
/* TODO: check for null Ähandles */
|
|
|
|
#include "iconcontrol.h"
|
|
#include <assert.h>
|
|
#include <Packages.h>
|
|
|
|
#include "iconcontrol.proto.h"
|
|
#include "getrects.proto.h"
|
|
|
|
void
|
|
drawicxx (Ptr pat, BitMap * mbm, Rect * dest, CWindowPtr w, short size, short depth)
|
|
{
|
|
PixMap spm;
|
|
Rect sr;
|
|
unsigned char state;
|
|
|
|
SetRect (&sr, 0, 0, size, size);
|
|
spm.baseAddr = pat;
|
|
spm.rowBytes = (size * depth / 8);
|
|
if (depth != 1)
|
|
spm.rowBytes |= 0x8000;
|
|
SetRect (&spm.bounds, 0, 0, size, size);
|
|
spm.pmVersion = 0;
|
|
spm.packType = 0;
|
|
spm.packSize = 0;
|
|
spm.hRes = spm.vRes = (Fixed) 72;
|
|
spm.pixelType = 0;
|
|
spm.pixelSize = depth;
|
|
spm.cmpCount = 1;
|
|
spm.cmpSize = depth;
|
|
spm.planeBytes = 0;
|
|
#if 0
|
|
/* TODO: figure out the correct way to get the CTabHandle */
|
|
spm.pmTable = (*w->portPixMap)->pmTable;
|
|
#else
|
|
spm.pmTable = GetCTable (depth);
|
|
#endif
|
|
|
|
SetRect (&sr, 0, 0, size, size);
|
|
state = HGetState ((Handle) w->portPixMap);
|
|
HLock ((Handle) w->portPixMap);
|
|
CopyMask ((BitMap *) & spm, mbm, (BitMap *) * w->portPixMap, &sr, &sr, dest);
|
|
HSetState ((Handle) w->portPixMap, state);
|
|
#if 1
|
|
DisposCTable (spm.pmTable);
|
|
#endif /* 0 */
|
|
}
|
|
|
|
|
|
void
|
|
dodrawcontrol (short varcode, ControlHandle c)
|
|
{
|
|
Rect r, dr, tr;
|
|
Handle mask, data;
|
|
GrafPtr saveport;
|
|
short textsize, depth, size, view, textfont;
|
|
BitMap mbm;
|
|
item **ih;
|
|
unsigned char mstate, dstate;
|
|
Str255 s;
|
|
RgnHandle save_clip_rgnh, new_clip_rgnh;
|
|
#if defined(YELLOW_HILITE)
|
|
RGBColor blendcolor, hilite_color;
|
|
|
|
blendcolor.red = blendcolor.green = 32767;
|
|
blendcolor.blue = 65535;
|
|
hilite_color.red = hilite_color.green = 65535;
|
|
hilite_color.blue = 0;
|
|
#else
|
|
RGBColor blendcolor, hilite_color;
|
|
|
|
blendcolor.red = 45000;
|
|
blendcolor.green = 32767;
|
|
blendcolor.blue = 65535;
|
|
hilite_color.red = 0;
|
|
hilite_color.green = 65535;
|
|
hilite_color.blue = 0;
|
|
#endif
|
|
|
|
GetPort (&saveport);
|
|
SetPort ((*c)->contrlOwner);
|
|
save_clip_rgnh = NewRgn ();
|
|
new_clip_rgnh = NewRgn ();
|
|
GetClip (save_clip_rgnh);
|
|
r = (*c)->contrlOwner->portRect;
|
|
r.right -= 15;
|
|
RectRgn (new_clip_rgnh, &r);
|
|
SectRgn (new_clip_rgnh, save_clip_rgnh, new_clip_rgnh);
|
|
SetClip (new_clip_rgnh);
|
|
|
|
ih = (item **) (*c)->contrlData;
|
|
getrects (c, &tr, &dr);
|
|
EraseRect (&tr);
|
|
InsetRect (&dr, -1, -1);
|
|
EraseRect (&dr);
|
|
InsetRect (&dr, 1, 1);
|
|
view = (*ih)->view;
|
|
if (view == ICSVIEW)
|
|
{
|
|
data = (*(*ih)->iconfam)->ics8;
|
|
if (data == 0 || (*(*theGDevice)->gdPMap)->pixelSize < 8)
|
|
{
|
|
data = (*(*ih)->iconfam)->ics4;
|
|
if (data == 0 || (*(*theGDevice)->gdPMap)->pixelSize < 4)
|
|
{
|
|
data = (*(*ih)->iconfam)->icssh;
|
|
depth = 1;
|
|
size = 16;
|
|
}
|
|
else
|
|
{
|
|
depth = 4;
|
|
size = 16;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
depth = 8;
|
|
size = 16;
|
|
}
|
|
mask = (*(*ih)->iconfam)->icssh;
|
|
assert ((mask == 0) ^ (data != 0));
|
|
}
|
|
if (view == ICONVIEW || (view == ICSVIEW && data == 0))
|
|
{
|
|
data = (*(*ih)->iconfam)->icl8;
|
|
if (data == 0 || (*(*theGDevice)->gdPMap)->pixelSize < 8)
|
|
{
|
|
data = (*(*ih)->iconfam)->icl4;
|
|
if (data == 0 || (*(*theGDevice)->gdPMap)->pixelSize < 4)
|
|
{
|
|
data = (*(*ih)->iconfam)->icnsh;
|
|
assert (data != 0);
|
|
depth = 1;
|
|
size = 32;
|
|
}
|
|
else
|
|
{
|
|
depth = 4;
|
|
size = 32;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
depth = 8;
|
|
size = 32;
|
|
}
|
|
mask = (*(*ih)->iconfam)->icnsh;
|
|
assert (mask != 0);
|
|
}
|
|
|
|
if (view != LISTVIEW)
|
|
{
|
|
dstate = HGetState (data);
|
|
HLock (data);
|
|
mstate = HGetState (mask);
|
|
HLock (mask);
|
|
mbm.baseAddr = *mask + size * size / 8;
|
|
mbm.rowBytes = size / 8;
|
|
SetRect (&mbm.bounds, 0, 0, size, size);
|
|
drawicxx (*data, &mbm, &dr, (CWindowPtr) (*c)->contrlOwner, size, depth);
|
|
if ((*c)->contrlHilite == inButton)
|
|
{
|
|
#if 0
|
|
CopyBits (&mbm, &(*c)->contrlOwner->portBits, &mbm.bounds, &dr, srcXor, (RgnHandle) 0);
|
|
#else
|
|
PenNormal ();
|
|
RGBForeColor (&hilite_color);
|
|
BackColor (whiteColor);
|
|
PenMode (blend);
|
|
OpColor (&blendcolor);
|
|
PaintOval (&dr);
|
|
PenNormal ();
|
|
ForeColor (blackColor);
|
|
BackColor (whiteColor);
|
|
#endif
|
|
}
|
|
else if ((*c)->contrlHilite == INSELECTEDICON)
|
|
{
|
|
#if 0
|
|
OpColor (halfwhite);
|
|
hiliteMode &= ~(1 << hiliteBit);
|
|
InvertRect (&dr);
|
|
#else
|
|
PenNormal ();
|
|
RGBForeColor (&hilite_color);
|
|
BackColor (whiteColor);
|
|
PenMode (blend);
|
|
OpColor (&blendcolor);
|
|
PaintOval (&dr);
|
|
PenNormal ();
|
|
ForeColor (blackColor);
|
|
BackColor (whiteColor);
|
|
#endif
|
|
}
|
|
HSetState (data, dstate);
|
|
HSetState (mask, mstate);
|
|
}
|
|
|
|
textsize = (*c)->contrlOwner->txSize;
|
|
textfont = (*c)->contrlOwner->txFont;
|
|
TextSize (FONTSIZE);
|
|
TextFont (applFont);
|
|
/* TODO: 8 should be figured out with getfontinfo */
|
|
if (view == LISTVIEW)
|
|
{
|
|
MoveTo (tr.left + ICSSIZE, tr.top + 8);
|
|
DrawString ((*c)->contrlTitle);
|
|
MoveTo (tr.left + SIZETEXTLEFT, tr.top + 8);
|
|
NumToString ((*ih)->size, s);
|
|
DrawString (s);
|
|
MoveTo (tr.left + DATETEXTLEFT, tr.top + 8);
|
|
IUDateString ((*ih)->moddate, abbrevDate, s);
|
|
DrawString (s);
|
|
}
|
|
else
|
|
{
|
|
MoveTo (tr.left, tr.top + 8);
|
|
DrawString ((*c)->contrlTitle);
|
|
}
|
|
TextSize (textsize);
|
|
TextFont (textfont);
|
|
|
|
if ((*(item **) (*c)->contrlData)->selected)
|
|
{
|
|
FrameRect (&dr);
|
|
FrameRect (&tr);
|
|
}
|
|
SetClip (save_clip_rgnh);
|
|
DisposeRgn (save_clip_rgnh);
|
|
DisposeRgn (new_clip_rgnh);
|
|
SetPort (saveport);
|
|
}
|
|
|
|
long
|
|
dotest (long param, ControlHandle c)
|
|
{
|
|
Point p;
|
|
Rect ir, tr;
|
|
|
|
p.v = HiWord (param);
|
|
p.h = LoWord (param);
|
|
getrects (c, &tr, &ir);
|
|
if ((*c)->contrlHilite != 255)
|
|
if (PtInRect (p, &ir))
|
|
if ((*(item **) (*c)->contrlData)->selected)
|
|
return (long) INSELECTEDICON;
|
|
else
|
|
return (long) inButton;
|
|
if (PtInRect (p, &tr))
|
|
return (long) INTEXT;
|
|
return 0L;
|
|
}
|
|
|
|
void
|
|
docalc (RgnHandle rgn, ControlHandle c)
|
|
{
|
|
RgnHandle rgn1, rgn2;
|
|
Rect ir, tr;
|
|
|
|
rgn1 = NewRgn ();
|
|
rgn2 = NewRgn ();
|
|
getrects (c, &tr, &ir);
|
|
RectRgn (rgn1, &ir);
|
|
RectRgn (rgn2, &tr);
|
|
UnionRgn (rgn1, rgn2, rgn);
|
|
DisposeRgn (rgn1);
|
|
DisposeRgn (rgn2);
|
|
}
|
|
|
|
void
|
|
dodispose (ControlHandle c)
|
|
{
|
|
DisposHandle ((Handle) (*c)->contrlData);
|
|
}
|
|
|
|
|
|
pascal long
|
|
main (short varcode, ControlHandle c, short message, long param)
|
|
{
|
|
long retval;
|
|
|
|
retval = 0;
|
|
switch (message)
|
|
{
|
|
case drawCntl:
|
|
/* Ignore param, always draw the whole control */
|
|
dodrawcontrol (varcode, c);
|
|
break;
|
|
case testCntl:
|
|
retval = dotest (param, c);
|
|
break;
|
|
case calcCRgns:
|
|
#ifdef LIVEDANGEROUSLY
|
|
if (param & 0x80000000)
|
|
param &= 0x00FFFFFF
|
|
#endif /* LIVEDANGEROUSLY */
|
|
/* FALL THROUGH --> */
|
|
case calcCntlRgn:
|
|
docalc ((RgnHandle) param, c);
|
|
break;
|
|
case dispCntl:
|
|
dodispose (c);
|
|
break;
|
|
case autoTrack:
|
|
break;
|
|
|
|
case initCntl:
|
|
case posCntl:
|
|
case thumbCntl:
|
|
case dragCntl:
|
|
case calcThumbRgn:
|
|
break;
|
|
default:
|
|
assert (0);
|
|
break;
|
|
}
|
|
return retval;
|
|
}
|