home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
200-299
/
ff287.lzh
/
PopDir
/
PopDir.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-12-06
|
6KB
|
212 lines
/* PopDir v1.5 © Copyright 1989 Jonathan Potter */
#include "PopDir.h"
void closeup();
main()
{
struct Gadget *Gadget;
int GadgetID,whichwin,file,x,y,a,Class,ox=31,oy=11;
ULONG prevsec=0,prevmic=0,sec,mic;
IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",0);
GfxBase=(struct GfxBase *) OpenLibrary("graphics.library",0);
if (!(finfo=(struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock),
MEMF_CHIP|MEMF_CLEAR))) closeup();
if (!(Window=(struct Window *) OpenWindow(&small))) closeup();
whichwin=1;
for (;;) {
if (whichwin==2) ActivateGadget(&StrGad,Window);
Wait(1<<Window->UserPort->mp_SigBit);
while (Msg=(struct IntuiMessage *) GetMsg(Window->UserPort)) {
Class=Msg->Class; sec=Msg->Seconds; mic=Msg->Micros;
if (Class==GADGETDOWN || Class==GADGETUP) {
Gadget=(struct Gadget *) Msg->IAddress;
GadgetID=Gadget->GadgetID;
}
ReplyMsg((struct Message *) Msg);
switch (Class) {
case INACTIVEWINDOW:
if (Window->LeftEdge!=ox && Window->LeftEdge!=small.LeftEdge)
small.LeftEdge=Window->LeftEdge;
if (Window->TopEdge!=oy && Window->TopEdge!=small.TopEdge)
small.TopEdge=Window->TopEdge;
CloseWindow(Window);
if (!(Window=(struct Window *) OpenWindow(&small))) closeup();
whichwin=1;
break;
case CLOSEWINDOW:
CloseWindow(Window);
if (whichwin==2) closeup();
if (!(Window=(struct Window *) OpenWindow(&med))) closeup();
SetWindowTitles(Window,-1,titlestring);
whichwin=2;
break;
case GADGETUP:
case GADGETDOWN:
if (whichwin==1) {
if (!(DoubleClick(prevsec,prevmic,sec,mic))) {
prevsec=sec; prevmic=mic;
break;
}
small.LeftEdge=Window->LeftEdge;
small.TopEdge=Window->TopEdge;
if (Window->LeftEdge+med.Width>Window->WScreen->Width)
med.LeftEdge=Window->WScreen->Width-med.Width;
else med.LeftEdge=Window->LeftEdge;
if (Window->TopEdge+med.Height>Window->WScreen->Height)
med.TopEdge=Window->WScreen->Height-med.Height;
else med.TopEdge=Window->TopEdge;
ox=med.LeftEdge; oy=med.TopEdge;
CloseWindow(Window);
if (!(Window=(struct Window *) OpenWindow(&med))) closeup();
SetWindowTitles(Window,-1,titlestring);
whichwin=2;
break;
}
if (GadgetID>1 && GadgetID<14) {
sprintf(dobuffer,Gadget->GadgetText->IText);
RefreshGList(&StrGad,Window,NULL,1);
break;
}
else if (GadgetID==14) {
do_parent();
RefreshGList(&StrGad,Window,NULL,1);
break;
}
if (dobuffer[(strlen(dobuffer)-1)]!='/' &&
dobuffer[(strlen(dobuffer)-1)]!=':')
strcat(dobuffer,'/');
whichwin=3;
med.LeftEdge=Window->LeftEdge;
med.TopEdge=Window->TopEdge;
CloseWindow(Window);
if (!(Window=(struct Window *) OpenWindow(&big))) closeup();
SetWindowTitles(Window,dobuffer,titlestring);
if ((lock=(struct FileLock *) Lock(dobuffer,ACCESS_READ))==0) {
sprintf(ToPrint,"Can't lock requested directory!");
PrintIText(Window->RPort,&Files,10,12);
sprintf(ToPrint,"Click on Close Gadget to continue");
WriteStatus();
goto finalquit;
}
Examine(lock,finfo);
file=0; y=12; x=10; a=0;
if (finfo->fib_DirEntryType<0) {
sprintf(ToPrint,"%-30s",finfo->fib_FileName);
PrintIText(Window->RPort,&Files,x,y);
sprintf(ToPrint,"%-7d",finfo->fib_Size);
PrintIText(Window->RPort,&Files,x+242,y);
sprintf(ToPrint,"Click on Close Gadget to continue");
WriteStatus();
goto finalquit;;
}
oldlock=(struct FileLock *) CurrentDir(lock);
Forbid();
while ((ExNext(lock,finfo))!=0) {
a=1;
if (file==0) {
sprintf(ToPrint,"Reading directory.. Close gadget to cancel");
WriteStatus();
}
if (Msg=(struct IntuiMessage *) GetMsg(Window->UserPort)) {
Class=Msg->Class;
ReplyMsg((struct Message *) Msg);
if (Class==CLOSEWINDOW) {
CloseWindow(Window);
if (!(Window=(struct Window *) OpenWindow(&med))) closeup();
SetWindowTitles(Window,-1,titlestring);
whichwin=2;
goto quit;
}
}
if (finfo->fib_DirEntryType>0)
Files.FrontPen=3;
sprintf(ToPrint,"%-30s",finfo->fib_FileName);
PrintIText(Window->RPort,&Files,x,y);
if (finfo->fib_DirEntryType<0) {
sprintf(ToPrint,"%-7d",finfo->fib_Size);
PrintIText(Window->RPort,&Files,x+242,y);
}
Files.FrontPen=1;
if (x==10) x=330;
else {
x=10;
y+=8;
}
++file;
if (file>43) {
sprintf(ToPrint,"Press any key to continue, or click on Close Gadget to cancel");
WriteStatus();
Wait(1<<Window->UserPort->mp_SigBit);
while (Msg=(struct IntuiMessage *) GetMsg(Window->UserPort)) {
Class=Msg->Class;
ReplyMsg((struct Message *) Msg);
if (Class==CLOSEWINDOW) {
CloseWindow(Window);
if (!(Window=(struct Window *) OpenWindow(&med))) closeup();
SetWindowTitles(Window,-1,titlestring);
whichwin=2;
goto quit;
}
}
SetAPen(Window->RPort,0);
RectFill(Window->RPort,9,10,637,198);
file=0; y=12; x=10;
}
}
if (a==0) {
sprintf(ToPrint,"Requested directory is empty");
PrintIText(Window->RPort,&Files,10,12);
}
sprintf(ToPrint,"Click on close gadget to continue");
WriteStatus();
quit:
Permit();
CurrentDir(oldlock);
UnLock(lock);
finalquit:
break;
default:
break;
}
}
}
}
WriteStatus()
{
SetAPen(Window->RPort,0);
RectFill(Window->RPort,2,189,637,198);
Files.FrontPen=3;
PrintIText(Window->RPort,&Files,10,189);
Files.FrontPen=1;
return(0);
}
do_parent()
{
int i,b;
if (strlen(dobuffer)==0) return(0);
i=strlen(dobuffer)-1;
if (dobuffer[i]==':') return(0);
if (dobuffer[i]=='/') --i;
for (b=i;b>-1;b--) if (dobuffer[b]=='/' || dobuffer[b]==':') break;
if (dobuffer[b]==':') dobuffer[++b]='\0';
if (b<0) b=0;
dobuffer[b]='\0';
}
void closeup()
{
if (finfo) FreeMem(finfo,sizeof(struct FileInfoBlock));
CloseLibrary((struct Library *) IntuitionBase);
CloseLibrary((struct Library *) GfxBase);
OpenWorkBench();
exit(0);
}