home *** CD-ROM | disk | FTP | other *** search
- /*
-
- Directory Opus 4
- Original GPL release version 4.12
- Copyright 1993-2000 Jonathan Potter
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- All users of Directory Opus 4 (including versions distributed
- under the GPL) are entitled to upgrade to the latest version of
- Directory Opus version 5 at a reduced price. Please see
- http://www.gpsoft.com.au for more information.
-
- The release of Directory Opus 4 under the GPL in NO WAY affects
- the existing commercial status of Directory Opus 5.
-
- */
-
- #include "DOpus.h"
- #include "ppdata.h"
-
- void makedir(rexx)
- int rexx;
- {
- int len,a,success,win,err;
- char dirname[32],new_directory[256];
- struct FileInfoBlock __aligned fileinfo;
- BPTR lock;
-
- win=data_active_window;
- dirname[0]=new_directory[0]=0;
- if (config->iconflags&ICONFLAG_MAKEDIRICON) len=25;
- else len=30;
-
- FOREVER {
- if (rexx) {
- for (a=0;a<256;a++) {
- if (!rexx_args[0][a] || rexx_args[0][a]=='/' || rexx_args[0][a]==':') break;
- }
- if (!rexx_args[0][a]) {
- if (!(isvalidwindow(data_active_window))) return;
- strcpy(new_directory,str_pathbuffer[data_active_window]);
- TackOn(new_directory,rexx_args[0],256);
- }
- else {
- strcpy(new_directory,rexx_args[0]);
- win=-1;
- }
- }
- else if (status_iconified) {
- if (!(status_flags&STATUS_ISINBUTTONS) ||
- (!(getdummypath(new_directory,STR_ENTER_DIRECTORY_NAME)))) return;
- win=-1;
- }
- else {
- if (!(isvalidwindow(data_active_window))) return;
- strcpy(new_directory,str_pathbuffer[data_active_window]);
-
- if (!(whatsit(globstring[STR_ENTER_DIRECTORY_NAME],len,dirname,NULL)) ||
- !dirname[0]) {
- myabort();
- return;
- }
- for (a=0;dirname[a];a++) {
- if (dirname[a]=='/' || dirname[a]==':') {
- dirname[a]=0;
- break;
- }
- }
- if (!dirname[0]) {
- myabort();
- return;
- }
- TackOn(new_directory,dirname,256);
- }
-
- if (!(lock=CreateDir(new_directory))) {
- doerror((err=IoErr()));
- if (rexx || (a=checkerror(globstring[STR_CREATING_DIRECTORY],
- BaseName(new_directory),-err))==3) {
- myabort();
- return;
- }
- continue;
- }
-
- Examine(lock,&fileinfo);
- UnLock(lock);
-
- if (win>-1) {
- addfile(dopus_curwin[win],win,fileinfo.fib_FileName,-1,
- fileinfo.fib_DirEntryType,&fileinfo.fib_Date,
- NULL,fileinfo.fib_Protection,0,TRUE,NULL,NULL,
- fileinfo.fib_OwnerUID,fileinfo.fib_OwnerGID);
- seename(win);
- update_buffer_stamp(win,1);
- }
-
- success=1;
- if (config->iconflags&ICONFLAG_MAKEDIRICON) {
- strcat(new_directory,".info");
- if ((iconwrite(ICONTYPE_DRAWER,new_directory))==1 &&
- (lockandexamine(new_directory,&fileinfo))) {
- if (win>-1) {
- addfile(dopus_curwin[win],win,fileinfo.fib_FileName,
- fileinfo.fib_Size,fileinfo.fib_DirEntryType,&fileinfo.fib_Date,
- fileinfo.fib_Comment,fileinfo.fib_Protection,0,TRUE,NULL,NULL,
- fileinfo.fib_OwnerUID,fileinfo.fib_OwnerGID);
- seename(win);
- update_buffer_stamp(win,1);
- }
- }
- else success=0;
- }
- break;
- }
- if (success) dostatustext(globstring[STR_DIRECTORY_CREATED]);
- }
-
- void blackout(screen,backupmap)
- struct Screen *screen;
- ULONG *backupmap;
- {
- get_palette(screen,backupmap);
- LoadRGB4(&screen->ViewPort,nullpalette,1<<screen->RastPort.BitMap->Depth);
- }
-
- iconwrite(type,name)
- int type;
- char *name;
- {
- int suc,err;
- struct DiskObject *diskobj;
- char namebuf[256],*ptr,*originalicon,sourcebuf[256];
- struct dopusfiletype *ftype;
-
- if (!IconBase) return(0);
-
- strcpy(namebuf,name);
- if ((ptr=strstri(namebuf,".info"))) *ptr=0;
-
- if (type==ICONTYPE_DRAWER) originalicon=config->drawericon;
- else if (type==ICONTYPE_TRASH) originalicon=NULL;
- else {
- ftype=checkfiletype(namebuf,-2,0);
- if (ftype && ftype->iconpath) originalicon=ftype->iconpath;
- else if (type==ICONTYPE_TOOL) originalicon=config->toolicon;
- else originalicon=config->projecticon;
- }
-
- if (originalicon) {
- strcpy(sourcebuf,originalicon);
- if (!(strstri(sourcebuf,".info"))) strcat(sourcebuf,".info");
- }
-
- FOREVER {
- if (originalicon && originalicon[0] && (CheckExist(sourcebuf,NULL)<0)) {
- if ((copyicon(originalicon,namebuf,&err))>0) return(1);
- }
- else {
- if (system_version2 && (diskobj=GetDefDiskObject(type+2))) {
- if (diskobj->do_Type==WBPROJECT && config->defaulttool[0]) {
- ptr=diskobj->do_DefaultTool;
- diskobj->do_DefaultTool=config->defaulttool;
- }
- else ptr=NULL;
- suc=PutDiskObject(namebuf,diskobj);
- if (ptr) diskobj->do_DefaultTool=ptr;
- FreeDiskObject(diskobj);
- if (suc) return(1);
- err=IoErr();
- }
- else {
- if (type==ICONTYPE_PROJECT)
- icontable[ICONTYPE_PROJECT]->do_DefaultTool=config->defaulttool;
- if (PutDiskObject(namebuf,icontable[type])) return(1);
- err=IoErr();
- }
- }
- if ((suc=checkerror(globstring[STR_ADDING_ICON],BaseName(namebuf),err))==3)
- return(-1);
- if (suc==0 || suc==2) return(0);
- }
- }
-
- copyicon(srce,dest,err)
- char *srce,*dest;
- int *err;
- {
- int suc;
- struct DiskObject *diskobj;
- char buf[256],buf1[256],*ptr;
-
- strcpy(buf1,srce);
- if ((ptr=strstri(buf1,".info"))) *ptr=0;
-
- if (diskobj=GetDiskObject(buf1)) {
- suc=PutDiskObject(dest,diskobj);
- FreeDiskObject(diskobj);
- if (!suc || CheckExist(dest,NULL)>=0) *err=IoErr();
- }
- else {
- StrCombine(buf,dest,".info",256);
- suc=copyfile(srce,buf,err,-1,NULL,0);
- }
- return(suc);
- }
-
- char *isicon(name)
- char *name;
- {
- int a;
-
- if ((a=strlen(name))<6) return(NULL);
- if (LStrCmpI(&name[a-5],".info")==0) return(&name[a-5]);
- return(NULL);
- }
-
- char *getarexxpath(rexx,win,num,argnum)
- int rexx,win,num,argnum;
- {
- int a,b;
- char *ptr;
- struct FileInfoBlock __aligned fblock;
- APTR save;
-
- if (!rexx || !rexx_argcount) return(str_pathbuffer[win]);
- if ((strchr(rexx_args[argnum],':') || strchr(rexx_args[argnum],'/')) &&
- (a=CheckExist(rexx_args[argnum],&b))) {
- if (!num) {
- save=main_proc->pr_WindowPtr;
- main_proc->pr_WindowPtr=(APTR)-1;
- dos_global_entry.subtype=0;
- if (lockandexamine(rexx_args[argnum],&fblock)) {
- dos_global_entry.protection=fblock.fib_Protection;
- dos_global_entry.comment=dos_copy_comment;
- strcpy(dos_copy_comment,fblock.fib_Comment);
- dos_global_entry.dispstr=NULL;
- getprot(dos_global_entry.protection,dos_global_entry.protbuf);
- CopyMem(&fblock.fib_Date,&dos_global_entry.date,sizeof(struct DateStamp));
- seedate(&dos_global_entry.date,dos_global_entry.datebuf,1);
- dos_global_entry.selected=0;
- }
- main_proc->pr_WindowPtr=save;
- ptr=BaseName(rexx_args[argnum]);
- strcpy(dos_global_entry.name,ptr);
- if (ptr>rexx_args[argnum]) {
- *ptr=0;
- strcpy(rexx_pathbuffer[win],rexx_args[argnum]);
- TackOn(rexx_pathbuffer[win],NULL,256);
- }
- else rexx_pathbuffer[win][argnum]=0;
- dos_global_entry.last=dos_global_entry.next=NULL;
- dos_global_entry.type=a;
- dos_global_entry.size=b;
- func_single_entry=&dos_global_entry;
- removeargstring(argnum);
- return(rexx_pathbuffer[win]);
- }
- else {
- strcpy(rexx_pathbuffer[win],rexx_args[argnum]);
- TackOn(rexx_pathbuffer[win],NULL,256);
- removeargstring(argnum);
- return(rexx_pathbuffer[win]);
- }
- }
- return(str_pathbuffer[win]);
- }
-
- readfile(name,buf,size)
- char *name,**buf;
- int *size;
- {
- int in,loadpp=0;
-
- if (PPBase) {
- if ((in=ppLoadData(name,DECR_POINTER,MEMF_CLEAR,buf,size,NULL))) {
- if (in==-1 || in==-2) return(-1);
- if (in==-3) return(-2);
- }
- else loadpp=1;
- }
- if (!loadpp) {
- if (CheckExist(name,size)>=0 || !(in=Open(name,MODE_OLDFILE))) return(-1);
- if (!(*buf=AllocMem(*size,MEMF_CLEAR))) {
- Close(in);
- return(-2);
- }
- Read(in,*buf,*size);
- Close(in);
- }
- return(0);
- }
-
- getnewprot(old,new,mask)
- int old,new,mask;
- {
- int val,a;
-
- if (!mask) return(new);
- val=old&(~255);
- for (a=0;a<8;a++) {
- if (mask&(1<<a)) {
- if (old&(1<<a)) val|=(1<<a);
- }
- else if (new&(1<<a)) val|=(1<<a);
- }
- return(val);
- }
-
- dateformat(flag)
- int flag;
- {
- int a;
-
- for (a=0;a<4;a++) {
- if (flag&(1<<a)) return(a);
- }
- return(a);
- }
-
- void dosound(type)
- int type;
- {
- struct IOAudio audio;
- static UBYTE achannels[8]={3,5,10,12,1,2,4,8};
- int a;
-
- if (type==0 && system_version2>=OSVER_38) DisplayBeep(NULL);
- else {
- audio.ioa_Request.io_Message.mn_ReplyPort=general_port;
- audio.ioa_Request.io_Message.mn_Node.ln_Pri=90;
- audio.ioa_Data=achannels;
- audio.ioa_Length=sizeof(achannels);
- if (!(a=OpenDevice("audio.device",0,(struct IORequest *)&audio,0))) {
- audio.ioa_Request.io_Command=CMD_WRITE;
- audio.ioa_Request.io_Flags=ADIOF_PERVOL;
- audio.ioa_Volume=64;
- audio.ioa_Data=(UBYTE *)beepwave;
- audio.ioa_Length=8;
- switch (type) {
- case 0:
- audio.ioa_Period=500;
- audio.ioa_Cycles=100;
- BeginIO((struct IORequest *)&audio);
- WaitIO((struct IORequest *)&audio);
- break;
- case 1:
- audio.ioa_Cycles=60;
- for (a=0;a<5;a++) {
- audio.ioa_Period=800;
- BeginIO((struct IORequest *)&audio);
- WaitIO((struct IORequest *)&audio);
- audio.ioa_Period=1200;
- BeginIO((struct IORequest *)&audio);
- WaitIO((struct IORequest *)&audio);
- }
- audio.ioa_Period=800;
- BeginIO((struct IORequest *)&audio);
- WaitIO((struct IORequest *)&audio);
- break;
- }
- CloseDevice((struct IORequest *)&audio);
- }
- }
- }
-
- checkscreenmode(mode)
- int mode;
- {
- DisplayInfoHandle *handle;
- struct DimensionInfo *dimension;
- char buf[256];
- int flags,minw,defw;
-
- if (mode==MODE_WORKBENCHUSE || mode==MODE_WORKBENCHCLONE || mode==MODE_PUBLICSCREEN)
- return(mode);
- if (!system_version2) {
- if (mode==HIRES_KEY || mode==HIRESLACE_KEY) return(mode);
- return(MODE_WORKBENCHCLONE);
- }
- if (!(handle=FindDisplayInfo(mode)) ||
- !(GetDisplayInfoData(handle,buf,256,DTAG_DISP,0)) ||
- ((struct DisplayInfo *)buf)->NotAvailable)
- return(MODE_WORKBENCHCLONE);
- flags=((struct DisplayInfo *)buf)->PropertyFlags;
- if (flags&DIPF_IS_DUALPF || flags&DIPF_IS_PF2PRI || flags&DIPF_IS_HAM ||
- !(GetDisplayInfoData(handle,buf,256,DTAG_DIMS,0)))
- return(MODE_WORKBENCHCLONE);
- dimension=(struct DimensionInfo *)buf;
- if (mode&HIRES_KEY || mode&HIRESLACE_KEY) minw=640;
- else {
- minw=dimension->MinRasterWidth;
- if (minw<160) minw*=10;
- }
- defw=(dimension->TxtOScan.MaxX-dimension->TxtOScan.MinX)+1;
- if (minw<640 || defw<640 && dimension->MaxDepth>=5)
- return(MODE_WORKBENCHCLONE);
- return(mode);
- }
-
- void doarrowgadgets(gad,dir)
- struct Gadget *gad;
- int dir;
- {
- int a;
-
- for (a=0;a<2;a++) {
- if (!gad) break;
- do3dbox(main_rp,
- gad->LeftEdge+2,
- gad->TopEdge+1,
- gad->Width-4,
- gad->Height-2);
- DoArrow(main_rp,
- gad->LeftEdge+2,
- gad->TopEdge+1,
- gad->Width-4,
- gad->Height-2,
- screen_pens[config->arrowfg].pen,
- screen_pens[config->arrowbg].pen,dir);
- gad=gad->NextGadget;
- }
- }
-
- void makermbgad(rmbgad,gad,high)
- struct RMBGadget *rmbgad;
- struct Gadget *gad;
- int high;
- {
- rmbgad->x=gad->LeftEdge;
- rmbgad->y=gad->TopEdge;
- rmbgad->w=gad->Width;
- rmbgad->h=gad->Height;
- if (high && gad->GadgetRender) {
- rmbgad->flags|=RGF_ALTBORD;
- rmbgad->high_bord[0]=gad->GadgetRender;
- rmbgad->high_bord[1]=gad->SelectRender;
- }
- else rmbgad->flags&=~RGF_ALTBORD;
- }
-
- void dolittlegads(gad,txt,num)
- struct Gadget *gad;
- char *txt;
- int num;
- {
- int a,y;
- struct TextFont *font;
-
- if (status_iconified || !Window) return;
-
- font=main_rp->Font;
- SetFont(main_rp,scr_font[FONT_GENERAL]);
- for (a=0;a<num;a++) {
- do3dbox(main_rp,gad->LeftEdge+2,gad->TopEdge+1,gad->Width-4,gad->Height-2);
- SetAPen(main_rp,screen_pens[config->littlegadbg].pen);
- rectfill(main_rp,gad->LeftEdge+2,gad->TopEdge+1,gad->Width-4,gad->Height-2);
- SetAPen(main_rp,screen_pens[config->littlegadfg].pen);
- SetBPen(main_rp,screen_pens[config->littlegadbg].pen);
- y=gad->TopEdge+1+(((gad->Height-2)-scr_font[FONT_GENERAL]->tf_YSize)/2);
- if (y<gad->TopEdge+1) y=gad->TopEdge+1;
- y+=scr_font[FONT_GENERAL]->tf_Baseline;
- Move(main_rp,gad->LeftEdge+((gad->Width-scr_font[FONT_GENERAL]->tf_XSize)/2),y);
- Text(main_rp,&txt[a],1);
- RefreshGList(gad,Window,NULL,1);
- if (!(gad=gad->NextGadget)) break;
- }
- SetFont(main_rp,font);
- }
-
- void rectfill(r,x,y,w,h)
- struct RastPort *r;
- int x,y,w,h;
- {
- if (w<0 || h<0) return;
- RectFill(r,x,y,x+w-1,y+h-1);
- }
-
- isinwindow(x,y)
- int x,y;
- {
- int win;
-
- for (win=0;win<2;win++) {
- if (x>=scrdata_dirwin_xpos[win] && x<scrdata_dirwin_xpos[win]+scrdata_dirwin_width[win] &&
- y>=scrdata_dirwin_ypos[win] && y<scrdata_dirwin_height+scrdata_dirwin_ypos[win]) return(win);
- }
- return(-1);
- }
-
- isvalidwindow(win)
- int win;
- {
- if (!str_pathbuffer[win]) return(0);
- if (dopus_curwin[win]->total>0 && dopus_curwin[win]->firstentry->type==ENTRY_CUSTOM)
- return(0);
- return(1);
- }
-