mirror of
https://github.com/ctm/executor.git
synced 2025-02-10 05:31:35 +00:00
430 lines
10 KiB
C
430 lines
10 KiB
C
#include "go.h"
|
|
#include "display.h"
|
|
#include "xfer.h"
|
|
#include <unix.h>
|
|
#include <assert.h>
|
|
|
|
#include "misc.proto.h"
|
|
#include "inithotband.proto.h"
|
|
|
|
/* todo: move to .h file */
|
|
#define HELPSCROLLBAR 3
|
|
#define HELPPICTITEM 2
|
|
#define HELPDIALOGID 204
|
|
#define HELPPICT 1000
|
|
|
|
pascal void
|
|
helpscroll (ControlHandle c, short part)
|
|
{
|
|
short v, v2, pagesize;
|
|
short type;
|
|
Rect r;
|
|
Handle h;
|
|
RgnHandle rgn, savergn;
|
|
|
|
v = GetCtlValue (c);
|
|
pagesize = (*c)->contrlRect.bottom - (*c)->contrlRect.top - 3;
|
|
switch (part)
|
|
{
|
|
case inUpButton:
|
|
SetCtlValue (c, v - SCROLLSPEED);
|
|
break;
|
|
case inDownButton:
|
|
SetCtlValue (c, v + SCROLLSPEED);
|
|
break;
|
|
case inPageDown:
|
|
SetCtlValue (c, v + pagesize);
|
|
break;
|
|
case inPageUp:
|
|
SetCtlValue (c, v - pagesize);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
v2 = GetCtlValue (c);
|
|
GetDItem ((*c)->contrlOwner, HELPPICTITEM, &type, &h, &r);
|
|
rgn = NewRgn ();
|
|
ScrollRect (&r, 0, v - v2, rgn);
|
|
#if 0
|
|
InvalRgn (rgn);
|
|
#else
|
|
savergn = (*c)->contrlOwner->clipRgn;
|
|
(*c)->contrlOwner->clipRgn = rgn;
|
|
drawhelp ((*c)->contrlOwner, HELPPICTITEM);
|
|
(*c)->contrlOwner->clipRgn = savergn;
|
|
#endif
|
|
DisposeRgn (rgn);
|
|
}
|
|
|
|
pascal void
|
|
drawhelp (DialogPtr dp, short item)
|
|
{
|
|
PicHandle ph;
|
|
Rect r, r2;
|
|
ControlHandle c;
|
|
short offset, type;
|
|
Handle h;
|
|
|
|
ph = (PicHandle) GetResource ('PICT', HELPPICT);
|
|
GetDItem (dp, HELPSCROLLBAR, &type, (Handle *) & c, &r);
|
|
offset = GetCtlValue (c);
|
|
GetDItem (dp, item, &type, &h, &r);
|
|
InsetRect (&r, -1, -1);
|
|
FrameRect (&r);
|
|
InsetRect (&r, 1, 1);
|
|
ClipRect (&r);
|
|
SetRect (&r2, r.left, r.top - offset,
|
|
r.left + (*ph)->picFrame.right - (*ph)->picFrame.left,
|
|
r.top - offset + (*ph)->picFrame.bottom - (*ph)->picFrame.top);
|
|
CopyBits (&((GrafPtr) (*c)->contrlRfCon)->portBits, &(*c)->contrlOwner->portBits,
|
|
&(*ph)->picFrame, &r2, patCopy, 0);
|
|
ClipRect (&dp->portRect);
|
|
}
|
|
|
|
pascal char
|
|
helpfilter (DialogPtr dp, EventRecord * ev, short *item)
|
|
{
|
|
ControlHandle c;
|
|
short part;
|
|
Point pt;
|
|
GrafPtr saveport;
|
|
|
|
if (ev->what == keyDown && (((ev->message & charCodeMask) == '\n') ||
|
|
((ev->message & charCodeMask) == 13)))
|
|
{
|
|
*item = 1;
|
|
return true;
|
|
}
|
|
else if (ev->what == mouseDown)
|
|
{
|
|
GetPort (&saveport);
|
|
SetPort (dp);
|
|
pt = ev->where;
|
|
GlobalToLocal (&pt);
|
|
part = FindControl (pt, dp, &c);
|
|
switch (part)
|
|
{
|
|
case inThumb:
|
|
TrackControl (c, pt, 0);
|
|
drawhelp ((*c)->contrlOwner, HELPPICTITEM);
|
|
break;
|
|
case inUpButton:
|
|
case inDownButton:
|
|
case inPageUp:
|
|
case inPageDown:
|
|
TrackControl (c, pt, helpscroll);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
SetPort (saveport);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void
|
|
help (void)
|
|
{
|
|
short item;
|
|
PicHandle ph;
|
|
Rect r;
|
|
ControlHandle c;
|
|
short type;
|
|
Handle h;
|
|
DialogPtr dp;
|
|
GrafPtr gp;
|
|
GrafPtr saveport;
|
|
|
|
dp = GetNewDialog (HELPDIALOGID, 0, 0);
|
|
/* TODO: adjust the window size based upon the screen size,
|
|
outline the done button
|
|
*/
|
|
GetDItem (dp, HELPSCROLLBAR, &type, (Handle *) & c, &r);
|
|
ph = (PicHandle) GetResource ('PICT', HELPPICT);
|
|
SetCtlMax (c, (*ph)->picFrame.bottom - (*ph)->picFrame.top - r.bottom + r.top);
|
|
|
|
GetPort (&saveport);
|
|
gp = (GrafPtr) NewPtr (sizeof (GrafPort));
|
|
OpenPort (gp);
|
|
gp->portBits.rowBytes = ((*ph)->picFrame.right - (*ph)->picFrame.left + 15) / 16 * 2;
|
|
gp->portBits.baseAddr = NewPtr (((*ph)->picFrame.bottom - (*ph)->picFrame.top) *
|
|
gp->portBits.rowBytes);
|
|
gp->portBits.bounds = (*ph)->picFrame;
|
|
(*c)->contrlRfCon = (long) gp;
|
|
SetPort (gp);
|
|
ClipRect (&gp->portBits.bounds);
|
|
RectRgn (gp->visRgn, &gp->portBits.bounds);
|
|
EraseRect (&gp->portBits.bounds);
|
|
DrawPicture (ph, &gp->portBits.bounds);
|
|
SetPort (saveport);
|
|
|
|
GetDItem (dp, HELPPICTITEM, &type, &h, &r);
|
|
SetDItem (dp, HELPPICTITEM, type, (Handle) drawhelp, &r);
|
|
ShowWindow (dp);
|
|
BringToFront (dp);
|
|
ModalDialog ((ProcPtr) helpfilter, &item);
|
|
DisposePtr (gp->portBits.baseAddr);
|
|
ClosePort (gp);
|
|
DisposPtr ((Ptr) gp);
|
|
DisposDialog (dp);
|
|
}
|
|
|
|
void
|
|
screensaver (void)
|
|
{
|
|
}
|
|
|
|
void
|
|
setband (short whichband)
|
|
{
|
|
short i, j, type;
|
|
bandinfo *p;
|
|
ControlHandle c;
|
|
Rect r;
|
|
|
|
p = &bands[g_currentband];
|
|
for (i = p->bandpos; i < p->numitems; i++)
|
|
HideControl ((**p->items)[i]);
|
|
GetDItem (g_hotband, g_currentband + 1, &type, (Handle *) & c, &r);
|
|
HiliteControl (c, 0);
|
|
|
|
g_currentband = whichband;
|
|
p = &bands[g_currentband];
|
|
for (i = p->bandpos, j = 0; i < p->numitems && j < g_numdispinhotband; i++, j++)
|
|
{
|
|
MoveControl ((**p->items)[i], FIRSTICONX + ICONWIDTHUSED * j, 0);
|
|
ShowControl ((**p->items)[i]);
|
|
}
|
|
GetDItem (g_hotband, g_currentband + 1, &type, (Handle *) & c, &r);
|
|
HiliteControl (c, 255);
|
|
checkhotbandcontrol ();
|
|
}
|
|
|
|
void
|
|
straightenwindow (WindowPtr wp)
|
|
{
|
|
opendirinfo **infoh;
|
|
short i, h, v, row, col, itemsperrow, height, numrows, ctlheight, top;
|
|
short heightused, widthused;
|
|
ControlHandle c;
|
|
GrafPtr saveport;
|
|
|
|
GetPort (&saveport);
|
|
SetPort (wp);
|
|
infoh = (opendirinfo **) ((WindowPeek) wp)->refCon;
|
|
|
|
switch ((*infoh)->view)
|
|
{
|
|
case ICONVIEW:
|
|
widthused = ICONWIDTHUSED;
|
|
heightused = ICONHEIGHTUSED;
|
|
break;
|
|
case ICSVIEW:
|
|
widthused = ICSWIDTHUSED;
|
|
heightused = ICSHEIGHTUSED;
|
|
break;
|
|
case LISTVIEW:
|
|
widthused = LISTWIDTHUSED;
|
|
heightused = LISTHEIGHTUSED;
|
|
break;
|
|
}
|
|
itemsperrow = (wp->portRect.right - wp->portRect.left) / widthused;
|
|
if (itemsperrow < 1)
|
|
itemsperrow = 1;
|
|
numrows = ((*infoh)->numitems - 1) / itemsperrow + 1;
|
|
|
|
c = (*infoh)->sbar;
|
|
height = wp->portRect.bottom - wp->portRect.top;
|
|
SizeControl (c, SCROLLBARWIDTH, height - SCROLLBARWIDTH + 2);
|
|
top = GetCtlValue (c);
|
|
ctlheight = numrows * heightused - height;
|
|
if (ctlheight < 0)
|
|
ctlheight = 0;
|
|
SetCtlMax (c, ctlheight);
|
|
if (top > ctlheight)
|
|
top = ctlheight;
|
|
SetCtlValue (c, top);
|
|
SetOrigin (0, top);
|
|
MoveControl (c, wp->portRect.right - SCROLLBARWIDTH + 1, wp->portRect.top);
|
|
drawpartialgrowicon (wp, false);
|
|
for (i = 0; i < (*infoh)->numitems; i++)
|
|
{
|
|
row = i / itemsperrow;
|
|
col = i % itemsperrow;
|
|
v = row * heightused;
|
|
h = col * widthused;
|
|
MoveControl ((**(*infoh)->items)[i], h, v);
|
|
}
|
|
if (GetCtlMax (c) <= 0)
|
|
HiliteControl (c, 255);
|
|
else
|
|
HiliteControl (c, 0);
|
|
if (FrontWindow () == wp)
|
|
ShowControl (c);
|
|
SetPort (saveport);
|
|
}
|
|
|
|
/* TODO: move to .h file */
|
|
#define GETINFOID 205
|
|
typedef enum
|
|
{
|
|
GETINFO_OK_ITEM = 1,
|
|
GETINFO_CANCEL_ITEM,
|
|
GETINFO_FILELABEL_ITEM,
|
|
GETINFO_CREATORLABEL_ITEM,
|
|
GETINFO_TYPELABEL_ITEM,
|
|
GETINFO_FILE_ITEM,
|
|
GETINFO_CREATOR_ITEM,
|
|
GETINFO_TYPE_ITEM
|
|
}
|
|
getinfo_items_t;
|
|
|
|
void
|
|
getinfo (void)
|
|
{
|
|
item **ih;
|
|
ControlHandle c;
|
|
CInfoPBRec pb;
|
|
Str255 s;
|
|
DialogPtr dp;
|
|
short type, itemno, valid;
|
|
Rect r;
|
|
Handle h;
|
|
/*
|
|
* TODO: add file size, modification date, etc.
|
|
* outline ok button
|
|
* center window
|
|
* check to see if it's a folder info is gotten about.
|
|
*/
|
|
|
|
c = (**g_selection)[0];
|
|
ih = (item **) (*c)->contrlData;
|
|
pb.hFileInfo.ioNamePtr = (*c)->contrlTitle;
|
|
pb.hFileInfo.ioVRefNum = (*ih)->vrefnum;
|
|
pb.hFileInfo.ioFDirIndex = 0;
|
|
pb.hFileInfo.ioDirID = (*ih)->ioparid;
|
|
PBGetCatInfo (&pb, false);
|
|
|
|
dp = GetNewDialog (GETINFOID, 0, (WindowPtr) - 1);
|
|
GetDItem (dp, GETINFO_FILE_ITEM, &type, &h, &r);
|
|
SetIText (h, (*c)->contrlTitle);
|
|
s[0] = 4;
|
|
memcpy ((char *) s + 1, (char *) &pb.hFileInfo.ioFlFndrInfo.fdCreator, 4);
|
|
GetDItem (dp, GETINFO_CREATOR_ITEM, &type, &h, &r);
|
|
SetIText (h, s);
|
|
s[0] = 4;
|
|
memcpy ((char *) s + 1, (char *) &pb.hFileInfo.ioFlFndrInfo.fdType, 4);
|
|
GetDItem (dp, GETINFO_TYPE_ITEM, &type, &h, &r);
|
|
SetIText (h, s);
|
|
SelIText (dp, GETINFO_CREATOR_ITEM, 0, 4);
|
|
|
|
ShowWindow (dp);
|
|
SetPort (dp);
|
|
do
|
|
{
|
|
ModalDialog ((ProcPtr) 0, &itemno);
|
|
valid = true;
|
|
if (itemno == GETINFO_OK_ITEM)
|
|
{
|
|
GetDItem (dp, GETINFO_CREATOR_ITEM, &type, &h, &r);
|
|
GetIText (h, s);
|
|
if (s[0] != 4)
|
|
valid = false;
|
|
else
|
|
memcpy ((char *) &pb.hFileInfo.ioFlFndrInfo.fdCreator,
|
|
(char *) s + 1, 4);
|
|
GetDItem (dp, GETINFO_TYPE_ITEM, &type, &h, &r);
|
|
GetIText (h, s);
|
|
if (s[0] != 4)
|
|
valid = false;
|
|
else
|
|
memcpy ((char *) &pb.hFileInfo.ioFlFndrInfo.fdType,
|
|
(char *) s + 1, 4);
|
|
if (valid)
|
|
{
|
|
pb.hFileInfo.ioDirID = (*ih)->ioparid;
|
|
PBSetCatInfo (&pb, false);
|
|
setoneicon (c);
|
|
}
|
|
else
|
|
{
|
|
ParamText ((StringPtr) "\pCreators and types are 4 characters long.",
|
|
0, 0, 0);
|
|
StopAlert (FOUR_PARAM_ALERT, (ProcPtr) 0);
|
|
}
|
|
}
|
|
}
|
|
while (!valid);
|
|
DisposDialog (dp);
|
|
}
|
|
|
|
void
|
|
savestate (void)
|
|
{
|
|
FILE *f;
|
|
CWindowPeek wp;
|
|
short i, j, res;
|
|
|
|
unlink (GOBACKUPFILE);
|
|
res = rename (GOSAVEFILE, GOBACKUPFILE);
|
|
if (res)
|
|
{
|
|
ParamText ((StringPtr) "\pThe old state file coulnd't be save",
|
|
0, 0, 0);
|
|
StopAlert (FOUR_PARAM_ALERT, (ProcPtr) 0);
|
|
return;
|
|
}
|
|
f = fopen (GOSAVEFILE, "w");
|
|
if (!f)
|
|
{
|
|
ParamText ((StringPtr) "\pThe browser's state could not be saved.",
|
|
0, 0, 0);
|
|
StopAlert (FOUR_PARAM_ALERT, (ProcPtr) 0);
|
|
return;
|
|
}
|
|
for (i = 0; i < NUMBANDS; i++)
|
|
{
|
|
if (i != VOLBAND)
|
|
{
|
|
for (j = 0; j < bands[i].numitems; j++)
|
|
fprintf (f, "%s\n",
|
|
*(*(item **) (*(**bands[i].items)[j])->contrlData)->path);
|
|
}
|
|
}
|
|
fprintf (f, "\n");
|
|
#ifdef THINK_C
|
|
for (wp = (CWindowPeek) WindowList; wp != 0; wp = wp->nextWindow)
|
|
{
|
|
#else
|
|
for (wp = (CWindowPeek) LMGetWindowList (); wp != 0; wp = wp->nextWindow)
|
|
{
|
|
#endif
|
|
if (wp != (CWindowPeek) g_hotband && (wp->windowKind == userKind))
|
|
{
|
|
fprintf (f, "%s\n", *(*(opendirinfo **) wp->refCon)->path);
|
|
OffsetRect (&wp->port.portRect, -(*wp->port.portPixMap)->bounds.left,
|
|
-(*wp->port.portPixMap)->bounds.top);
|
|
fprintf (f, "%d %d %d %d\n", wp->port.portRect.left,
|
|
wp->port.portRect.top, wp->port.portRect.right,
|
|
wp->port.portRect.bottom);
|
|
}
|
|
}
|
|
res = fclose (f);
|
|
if (res)
|
|
{
|
|
ParamText ((StringPtr) "\pThe browser's state could not be saved.",
|
|
0, 0, 0);
|
|
StopAlert (FOUR_PARAM_ALERT, (ProcPtr) 0);
|
|
return;
|
|
}
|
|
/* TODO: make save file invisible */
|
|
res = unlink (GOBACKUPFILE);
|
|
if (res)
|
|
{
|
|
ParamText ((StringPtr) "\pThe browser's backup state file could not be removed.",
|
|
0, 0, 0);
|
|
StopAlert (FOUR_PARAM_ALERT, (ProcPtr) 0);
|
|
return;
|
|
}
|
|
}
|