corrections to check for existing files.
[AROS-Contrib.git] / dopus / Library / filereq.c
bloba09a5474ce6975dccc56b78b436d05e946da1ae2
1 /*
3 Directory Opus 4
4 Original GPL release version 4.12
5 Copyright 1993-2000 Jonathan Potter
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 All users of Directory Opus 4 (including versions distributed
22 under the GPL) are entitled to upgrade to the latest version of
23 Directory Opus version 5 at a reduced price. Please see
24 http://www.gpsoft.com.au for more information.
26 The release of Directory Opus 4 under the GPL in NO WAY affects
27 the existing commercial status of Directory Opus 5.
31 #include "dopuslib.h"
32 #include <dopus/filereq.h>
34 #define ASL_V38_NAMES_ONLY
36 void close_req(struct FileReqData *freqdata);
37 void deallocate_entries(struct FileReqData *freqdata);
38 void clearfiles(struct FileReqData *freqdata);
39 void doprops(struct FileReqData *freqdata);
40 void fixprop(struct FileReqData *freqdata);
41 void checkdrawer(char *buf);
42 void refreshdrawergad(struct FileReqData *freqdata);
43 //void activatestrgad(struct Window *win,struct Gadget *gad);
44 void activatefilegad(struct FileReqData *freqdata);
45 struct direntry *getfileentry(struct FileReqData *freqdata,int which);
46 void freemulti(struct DOpusFileReq *freq);
47 void addfileentry(struct FileReqData *freqdata,char *name,int type,int size);
48 void repeatscroll(struct FileReqData *freqdata,int dir,int menu);
49 int initrequester(struct FileReqData *freqdata);
50 int get_filenames(struct FileReqData *freqdata);
51 int getintuimsg(struct Window *win,ULONG *class,UWORD *code,UWORD *qual,UWORD *gadgetid);
52 int do_idcmp(struct FileReqData *freqdata,ULONG class,UWORD code,UWORD qual,UWORD gadgetid);
53 int doparent(struct FileReqData *freqdata);
54 int listdevices(struct FileReqData *freqdata);
56 int __regargs gettingdirmsg(struct FileReqData *freqdata,ULONG class,UWORD code,UWORD qual,UWORD gadgetid);
58 const static struct PropInfo
59 defaultprop={PROPBORDERLESS|FREEVERT,0,0,0,0xffff};
60 const static struct Image
61 defaultimage={0,0,8,22,1,NULL,0,1,NULL};
63 struct IntuiText
64 defaulttext[6]={
65 {1,0,JAM1,0,0,NULL,(UBYTE *)"File",NULL},
66 {1,0,JAM1,0,0,NULL,(UBYTE *)"Drawer",NULL},
67 {1,0,JAM1,0,2,NULL,(UBYTE *)"Accept",NULL},
68 {1,0,JAM1,0,2,NULL,(UBYTE *)"Cancel",NULL},
69 {1,0,JAM1,0,2,NULL,(UBYTE *)"Parent",NULL},
70 {1,0,JAM1,0,2,NULL,(UBYTE *)"Drives",NULL}};
72 const static struct Gadget
73 defaultgadgets[9]={
74 {NULL,64,47,240,8,GADGHCOMP,RELVERIFY|TOGGLESELECT,STRGADGET,
75 NULL,NULL,NULL,NULL,NULL,FILENAME,NULL},
76 {NULL,64,34,240,8,GADGHCOMP,RELVERIFY|TOGGLESELECT,STRGADGET,
77 NULL,NULL,NULL,NULL,NULL,DRAWERNAME,NULL},
78 {NULL,8,59,132,12,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
79 NULL,NULL,NULL,OKAY,NULL},
80 {NULL,176,59,132,12,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
81 NULL,NULL,NULL,CANCEL,NULL},
82 {NULL,292,14,16,8,GADGHCOMP,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,
83 NULL,NULL,NULL,NULL,NULL,FILENAMEUP,NULL},
84 {NULL,292,22,16,8,GADGHCOMP,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,
85 NULL,NULL,NULL,NULL,NULL,FILENAMEDOWN,NULL},
86 {NULL,8,14,132,12,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
87 NULL,NULL,NULL,PARENT,NULL},
88 {NULL,176,14,132,12,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
89 NULL,NULL,NULL,DRIVES,NULL},
90 {NULL,296,30,8,22,GADGHNONE,GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY,PROPGADGET,
91 NULL,NULL,NULL,NULL,NULL,FILENAMEPOS,NULL}};
93 const static struct NewWindow defaultwindow={
94 15,25,316,115,0,1,IDCMP_GADGETUP|IDCMP_GADGETDOWN|IDCMP_MOUSEMOVE|IDCMP_MOUSEBUTTONS,
95 WFLG_SMART_REFRESH|WFLG_NOCAREREFRESH|WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_DRAGBAR,
96 NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN};
98 char *devtypes[5]={" <DEV>"," <ASN>"," <VOL>"," <DFR>"," <NBD>"};
100 extern char nullstring[];
102 static inline void __regargs doprops(struct FileReqData *freqdata)
104 DoFixSliderPot(freqdata->fr_Window,&freqdata->reqgads[8],freqdata->fileoffset,freqdata->fileentries,freqdata->freq->lines,1);
107 static inline void __regargs fixprop(struct FileReqData *freqdata)
109 DoFixSliderBody(freqdata->fr_Window,&freqdata->reqgads[8],freqdata->fileentries,freqdata->freq->lines,1);
112 static inline void __regargs activatefilegad(struct FileReqData *freqdata)
114 ActivateStrGad(&freqdata->reqgads[(freqdata->flags&DFRF_DIRREQ)?1:0],freqdata->fr_Window);
117 void __regargs deallocate_entries(struct FileReqData *freqdata)
119 DoFreeRemember(&freqdata->filekey);
120 freqdata->firstfile=freqdata->firstdir=NULL;
121 freqdata->fileentries=freqdata->fileoffset=0; freqdata->oldfileoffset=-1;
124 void __regargs freemulti(struct DOpusFileReq *freq)
126 if (freq->flags&DFRF_MULTI) DoFreeRemember(&freq->filearraykey);
127 freq->filearray=NULL;
130 void __regargs close_req(struct FileReqData *freqdata)
132 struct direntry *file;
133 struct DOpusFileReq *freq;
134 char *buf;
135 int b;
137 if (freqdata) {
138 freq=freqdata->freq;
139 if (freqdata->fr_Window) {
140 freqdata->freq->x=freqdata->fr_Window->LeftEdge;
141 freqdata->freq->y=freqdata->fr_Window->TopEdge;
142 CloseWindow(freqdata->fr_Window);
144 if (freqdata->flags&DFRF_MULTI && (file=freqdata->firstfile)) {
145 b=1;
146 while (file) {
147 if (file->select) ++b;
148 file=file->next;
150 if (freq->filearray=(char **)DoAllocRemember(&freq->filearraykey,sizeof(char *)*b,MEMF_CLEAR)) {
151 if (buf=(char *)DoAllocRemember(&freq->filearraykey,b*FILEBUF_SIZE/*32*/,MEMF_CLEAR)) {
152 file=freqdata->firstfile; b=0;
153 while (file) {
154 if (file->select) {
155 freq->filearray[b]=&buf[b*FILEBUF_SIZE/*32*/];
156 LStrCpy(freq->filearray[b],file->name);
157 ++b;
159 file=file->next;
161 freq->filearray[b]=&buf[b*FILEBUF_SIZE/*32*/];
162 freq->filearray[b][0]=0;
164 else freemulti(freq);
167 deallocate_entries(freqdata);
168 if (freqdata->filetype)
169 FreeMem(freqdata->filetype,sizeof(int)*freqdata->freq->lines);
170 if (freqdata->finfo) FreeMem(freqdata->finfo,sizeof(struct FileInfoBlock));
171 FreeMem(freqdata,sizeof(struct FileReqData));
175 void __regargs displayfiles(struct FileReqData *freqdata)
177 struct direntry *work;
178 struct RastPort *rp;
179 int a,b,y,nlim,slim;
181 if (freqdata->fileoffset==freqdata->oldfileoffset) return/*(0)*/;
182 freqdata->oldfileoffset=freqdata->fileoffset;
183 if ((work=freqdata->firstfile)) {
184 for (a=0;a<freqdata->fileoffset;a++)
185 if (!(work=work->next)) break;
187 rp=freqdata->fr_Window->RPort;
189 y=freqdata->fy+freqdata->fb;
190 nlim=freqdata->width-7; slim=7;
191 if (nlim<8) {
192 nlim=8;
193 slim=freqdata->width-8;
195 if (nlim>freqdata->width) {
196 nlim=freqdata->width;
197 slim=0;
199 SetDrMd(rp,JAM2);
200 for (b=0;b<freqdata->freq->lines;b++) {
201 Move(rp,10,y);
202 if (work) {
203 freqdata->filetype[b]=work->type;
204 if (work->type<0) {
205 if (work->select) {
206 SetAPen(rp,2);
207 SetBPen(rp,3);
209 else SetAPen(rp,1);
211 else if (work->type>0) SetAPen(rp,3);
212 else SetAPen(rp,2);
213 a=strlen(work->name); if (a>nlim) a=nlim;
214 Text(rp,work->name,a);
215 if (a<nlim) Text(rp,nullstring,nlim-a);
216 if (slim) Text(rp,work->size,slim);
217 if (work->select) SetBPen(rp,0);
218 work=work->next;
220 else Text(rp,nullstring,freqdata->width);
221 y+=freqdata->fh;
225 void __regargs doposprop(struct FileReqData *freqdata)
227 freqdata->fileoffset=DoGetSliderPos(&freqdata->reqgads[8],freqdata->fileentries,freqdata->freq->lines);
228 displayfiles(freqdata);
231 void __regargs addfileentry(struct FileReqData *freqdata,char *name,int type,int size)
233 struct direntry *add,*afterdir=NULL,*work,*new;
234 int adir=0;
236 if (freqdata->firstfile) {
237 if (type<0) {
238 if (freqdata->firstdir) add=freqdata->firstdir;
239 else {
240 add=freqdata->firstfile;
241 while (add && add->type>0) add=add->next;
244 else add=freqdata->firstfile;
245 while (add) {
246 if (LStrCmpI(name,add->name)<=0 ||
247 (type>0 && add==freqdata->firstdir)) {
248 if (add->last) afterdir=add->last;
249 else adir=1;
250 break;
252 add=add->next;
256 if (!(new=(struct direntry *)
257 DoAllocRemember(&freqdata->filekey,sizeof(struct direntry),MEMF_CLEAR)))
258 return/*(0)*/;
260 if (afterdir) {
261 work=afterdir;
262 add=afterdir->next;
263 work->next=new;
264 new->last=work;
265 work=new;
266 work->next=add;
267 add->last=work;
269 else if (adir==1) {
270 add=freqdata->firstfile;
271 work=new;
272 work->next=add;
273 add->last=work;
274 freqdata->firstfile=work;
276 else {
277 if (freqdata->firstfile) {
278 work=freqdata->firstfile;
279 while (work->next) work=work->next;
280 work->next=new;
281 new->last=work;
282 work=new;
284 else {
285 work=new;
286 freqdata->firstfile=work;
289 LStrCpy(work->name,name);
290 if (type==0) LStrCpy(work->size,devtypes[size]);
291 else if (type<0) {
292 LSprintf(work->size,"%7ld",size);
293 if ((work->last && work->last->type>0) || (!work->last && type<0))
294 freqdata->firstdir=work;
296 else LStrCpy(work->size,string_table[STR_FILEREQ_DIR]);
297 work->type=type;
298 ++freqdata->fileentries;
301 int __regargs getintuimsg(struct Window *win,ULONG *class,UWORD *code,UWORD *qual,UWORD *gadgetid)
303 struct IntuiMessage *msg;
305 if (msg=(struct IntuiMessage *)GetMsg(win->UserPort)) {
306 *class=msg->Class; *code=msg->Code;
307 if (qual) *qual=msg->Qualifier;
308 if (msg->Class==GADGETDOWN || msg->Class==GADGETUP)
309 *gadgetid=((struct Gadget *)msg->IAddress)->GadgetID;
310 ReplyMsg((struct Message *)msg);
311 return(1);
313 return(0);
316 void __regargs refreshdrawergad(struct FileReqData *freqdata)
318 freqdata->drawernamesinfo.BufferPos=strlen(freqdata->freq->dirbuf);
319 RefreshGList(&freqdata->reqgads[1],freqdata->fr_Window,NULL,1);
322 void __regargs checkdrawer(char *buf)
324 int i;
326 if ((i=strlen(buf))>1) {
327 --i;
328 if (buf[i]!='/' && buf[i]!=':') LStrCat(buf,"/");
332 void __regargs clearfiles(struct FileReqData *freqdata)
334 deallocate_entries(freqdata);
335 doprops(freqdata);
336 fixprop(freqdata);
337 displayfiles(freqdata);
340 int __regargs get_filenames(struct FileReqData *freqdata)
342 BPTR lock;
343 ULONG class;
344 UWORD code,qual,gadgetid;
345 int ret=0;
346 char buf[33];
348 freqdata->firstfile=freqdata->firstdir=NULL;
350 if (!(lock=Lock(freqdata->freq->dirbuf,ACCESS_READ))) {
351 freqdata->oldfileoffset=-1; freqdata->fileentries=0;
352 fixprop(freqdata);
353 displayfiles(freqdata);
354 return(0);
357 Examine(lock,freqdata->finfo);
358 if (freqdata->finfo->fib_DirEntryType<0) {
359 UnLock(lock);
360 freqdata->oldfileoffset=-1;
361 displayfiles(freqdata);
362 return(0);
365 while (ExNext(lock,freqdata->finfo)) {
366 while (getintuimsg(freqdata->fr_Window,&class,&code,&qual,&gadgetid)) {
367 ret=gettingdirmsg(freqdata,class,code,qual,gadgetid);
368 if (ret==OKAY || ret==CANCEL || ret==INTERRUPT) {
369 UnLock(lock);
370 return(ret);
373 if (freqdata->finfo->fib_DirEntryType<0) {
374 if (freqdata->flags&DFRF_FONT) {
375 LSprintf(buf,"%ld",atoi(freqdata->finfo->fib_FileName));
376 if (LStrCmp(buf,freqdata->finfo->fib_FileName)) continue;
378 else if (freqdata->flags&DFRF_DIRREQ) continue;
380 addfileentry(freqdata,freqdata->finfo->fib_FileName,
381 freqdata->finfo->fib_DirEntryType,freqdata->finfo->fib_Size);
382 freqdata->oldfileoffset=-1;
383 fixprop(freqdata);
384 doposprop(freqdata);
386 UnLock(lock);
387 freqdata->oldfileoffset=-1;
388 displayfiles(freqdata);
389 return(ret);
392 int __regargs getnewdrawer(struct FileReqData *freqdata)
394 checkdrawer(freqdata->freq->dirbuf);
395 refreshdrawergad(freqdata);
396 activatefilegad(freqdata);
397 clearfiles(freqdata);
398 return(get_filenames(freqdata));
401 int __regargs getnew_file(struct FileReqData *freqdata,struct direntry *work)
403 int i,b;
405 if (work->type>0) {
406 DoTackOn(freqdata->freq->dirbuf,work->name,256);
407 i=getnewdrawer(freqdata);
408 if (i!=OKAY && i!=CANCEL && i!=INTERRUPT) i=INTERRUPT;
409 return(i);
411 if (work->type==0) {
412 LStrCpy(freqdata->freq->dirbuf,work->name);
413 i=getnewdrawer(freqdata);
414 if (i!=OKAY && i!=CANCEL && i!=INTERRUPT) i=INTERRUPT;
415 return(i);
417 if ((LStrCmp(freqdata->freq->filebuf,work->name))==0) b=1;
418 else b=0;
419 LStrCpy(freqdata->freq->filebuf,work->name);
420 RefreshGList(&freqdata->reqgads[0],freqdata->fr_Window,NULL,1);
421 return(b);
424 int __regargs listdevices(struct FileReqData *freqdata)
426 char devname[32];
427 struct DeviceList *devlist;
428 struct RootNode *rootnode;
429 struct DosInfo *dosinfo;
430 ULONG class;
431 UWORD code,qual,gadgetid;
432 int ret;
434 clearfiles(freqdata);
435 rootnode=(struct RootNode *) DOSBase->dl_Root;
436 dosinfo=(struct DosInfo *) BADDR(rootnode->rn_Info);
437 devlist=(struct DeviceList *) BADDR(dosinfo->di_DevInfo);
439 while (devlist) {
440 while (getintuimsg(freqdata->fr_Window,&class,&code,&qual,&gadgetid)) {
441 ret=gettingdirmsg(freqdata,class,code,qual,gadgetid);
442 if (ret==OKAY || ret==CANCEL || ret==INTERRUPT) return(ret);
444 if (devlist->dl_Type!=DLT_DEVICE || devlist->dl_Task) {
445 BtoCStr(devlist->dl_Name,devname,32);
446 LStrCat(devname,":");
447 addfileentry(freqdata,devname,0,devlist->dl_Type);
449 devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
451 freqdata->oldfileoffset=-1;
452 fixprop(freqdata);
453 doposprop(freqdata);
454 return(-1);
457 void __regargs repeatscroll(struct FileReqData *freqdata,int dir,int menu)
459 ULONG class;
460 UWORD code,gadgetid;
461 int x,y,m;
463 if ((dir==-1 && freqdata->fileoffset==0) ||
464 (dir==1 && freqdata->fileoffset>=freqdata->fileentries-freqdata->freq->lines))
465 return/*(0)*/;
466 freqdata->fileoffset+=dir;
467 displayfiles(freqdata);
468 doprops(freqdata);
469 if (menu) m=((freqdata->freq->lines*freqdata->fh)/2)+30;
470 Delay(5);
471 FOREVER {
472 if (getintuimsg(freqdata->fr_Window,&class,&code,NULL,&gadgetid) &&
473 ((class==GADGETUP || (class==MOUSEBUTTONS && code==SELECTUP)) ||
474 (menu && class==MOUSEBUTTONS && code==MENUUP))) break;
475 if (menu) {
476 x=freqdata->fr_Window->MouseX; y=freqdata->fr_Window->MouseY;
477 if (x>9 && x<freqdata->ww+10) {
478 if (y<(m-freqdata->fh)) dir=-1;
479 else if (y>(m+freqdata->fh)) dir=1;
480 else dir=0;
483 if ((dir==-1 && freqdata->fileoffset==0) ||
484 (dir==1 && freqdata->fileoffset>=freqdata->fileentries-freqdata->freq->lines))
485 break;
486 freqdata->fileoffset+=dir;
487 displayfiles(freqdata);
488 doprops(freqdata);
492 int __regargs doparent(struct FileReqData *freqdata)
494 int i,b;
496 if ((i=strlen(freqdata->freq->dirbuf))<2) return(0);
497 --i;
498 if (freqdata->freq->dirbuf[i]==':') return(0);
499 if (freqdata->freq->dirbuf[i]=='/') --i;
500 for (b=i;b>-1;b--) {
501 if (freqdata->freq->dirbuf[b]=='/') break;
502 if (freqdata->freq->dirbuf[b]==':') { ++b; break; }
504 if (b<0) b=0;
505 freqdata->freq->dirbuf[b]=0;
506 RefreshGList(&freqdata->reqgads[1],freqdata->fr_Window,NULL,1);
507 return(1);
510 struct direntry * __regargs getfileentry(struct FileReqData *freqdata,int which)
512 int i,b;
513 struct direntry *work;
515 i=freqdata->fileoffset+which;
516 if (!(work=freqdata->firstfile)) return(0);
517 for (b=0;b<i;b++) if (!(work=work->next)) return(0);
518 return(work);
521 int __regargs do_idcmp(struct FileReqData *freqdata,ULONG class,UWORD code,UWORD qual,UWORD gadgetid)
523 int ret=0,x,y,a,b,ty;
524 struct RastPort *rp;
525 struct direntry *file;
526 LONG sec,mic;
528 switch (class) {
529 case IDCMP_GADGETDOWN:
530 switch (gadgetid) {
531 case FILENAMEPOS:
532 doposprop(freqdata);
533 FOREVER {
534 Wait(1<<freqdata->fr_Window->UserPort->mp_SigBit);
535 while (getintuimsg(freqdata->fr_Window,&class,&code,&qual,&gadgetid)) {
536 if (class==GADGETUP) break;
537 if (class==MOUSEMOVE) doposprop(freqdata);
539 if (class==GADGETUP) break;
541 break;
542 case FILENAMEUP:
543 repeatscroll(freqdata,-1,0);
544 break;
545 case FILENAMEDOWN:
546 repeatscroll(freqdata,1,0);
547 break;
549 activatefilegad(freqdata);
550 return(0);
551 case IDCMP_GADGETUP:
552 switch (gadgetid) {
553 case FILENAMEPOS:
554 doposprop(freqdata);
555 break;
556 case CANCEL:
557 ret=CANCEL;
558 break;
559 case FILENAME:
560 if (qual&IEQUALIFIER_LSHIFT || qual&IEQUALIFIER_RSHIFT) {
561 ActivateStrGad(&freqdata->reqgads[1],freqdata->fr_Window);
562 return(-1);
564 ret=OKAY;
565 break;
566 case OKAY:
567 ret=OKAY;
568 break;
569 case DRAWERNAME:
570 refreshdrawergad(freqdata);
571 if (qual&IEQUALIFIER_LSHIFT || qual&IEQUALIFIER_RSHIFT) {
572 activatefilegad(freqdata);
573 return(-1);
575 if ((ret=getnewdrawer(freqdata))!=OKAY && ret!=CANCEL && ret!=INTERRUPT)
576 ret=INTERRUPT;
577 return(ret);
578 case PARENT:
579 if (doparent(freqdata)) {
580 if ((ret=getnewdrawer(freqdata))!=OKAY && ret!=CANCEL && ret!=INTERRUPT)
581 ret=INTERRUPT;
583 break;
584 case DRIVES:
585 activatefilegad(freqdata);
586 if ((ret=listdevices(freqdata))!=OKAY && ret!=CANCEL && ret!=INTERRUPT)
587 ret=INTERRUPT;
588 break;
590 activatefilegad(freqdata);
591 return(ret);
592 break;
593 case IDCMP_MOUSEBUTTONS:
594 x=freqdata->fr_Window->MouseX; y=freqdata->fr_Window->MouseY;
595 if (code==SELECTDOWN &&
596 x>9 && x<freqdata->ww+10 && y>=freqdata->fy && y<freqdata->fy+(freqdata->freq->lines*freqdata->fh)) {
597 a=(y-freqdata->fy)/freqdata->fh;
598 if (file=getfileentry(freqdata,a)) {
599 b=1; ty=freqdata->fy+(a*freqdata->fh);
600 rp=freqdata->fr_Window->RPort;
601 SetDrMd(rp,COMPLEMENT);
602 RectFill(rp,10,ty,freqdata->ww+9,ty+(freqdata->fh-1));
603 if (freqdata->flags&DFRF_MULTI && file->type<0) {
604 file->select=1-file->select;
605 b=1;
607 else {
608 freqdata->fr_Window->Flags|=WFLG_REPORTMOUSE;
609 FOREVER {
610 Wait(1<<freqdata->fr_Window->UserPort->mp_SigBit);
611 while (getintuimsg(freqdata->fr_Window,&class,&code,&qual,&gadgetid)) {
612 if (class==MOUSEMOVE) {
613 x=freqdata->fr_Window->MouseX; y=freqdata->fr_Window->MouseY;
614 if (x<10 || x>freqdata->ww+9 || y<ty || y>=ty+freqdata->fh) {
615 if (b) {
616 b=0;
617 RectFill(rp,10,ty,freqdata->ww+9,ty+(freqdata->fh-1));
620 else if (!b) {
621 b=1;
622 RectFill(rp,10,ty,freqdata->ww+9,ty+(freqdata->fh-1));
625 else if (class==MOUSEBUTTONS && code==SELECTUP) break;
627 if (class==MOUSEBUTTONS && code==SELECTUP) break;
629 freqdata->fr_Window->Flags&=~WFLG_REPORTMOUSE;
631 if (b) {
632 if (!(freqdata->flags&DFRF_MULTI))
633 RectFill(rp,10,ty,freqdata->ww+9,ty+(freqdata->fh-1));
634 SetDrMd(rp,JAM2);
635 CurrentTime((ULONG *)&sec,(ULONG *)&mic);
636 if ((ret=getnew_file(freqdata,file))==1 &&
637 DoubleClick(freqdata->prevsec,freqdata->prevmic,sec,mic)) ret=OKAY;
638 else if (ret!=OKAY && ret!=CANCEL && ret!=INTERRUPT) {
639 freqdata->prevsec=sec; freqdata->prevmic=mic;
640 ret=0;
643 else SetDrMd(rp,JAM2);
646 else if (code==MENUDOWN &&
647 x>9 && x<freqdata->ww+10 && y>28 && y<37+(freqdata->freq->lines*freqdata->fh)) {
648 a=((freqdata->freq->lines*freqdata->fh)/2)+30;
649 if (y<(a-freqdata->fh)) b=-1;
650 else if (y>(a+freqdata->fh)) b=1;
651 else b=0;
652 repeatscroll(freqdata,b,1);
654 activatefilegad(freqdata);
655 return(ret);
656 break;
657 default:
658 activatefilegad(freqdata);
659 break;
661 return(0);
664 int __regargs gettingdirmsg(struct FileReqData *freqdata,ULONG class,UWORD code, UWORD qual,UWORD gadgetid)
666 int ret;
668 if ((ret=do_idcmp(freqdata,class,code,qual,gadgetid))!=-1) {
669 freqdata->oldfileoffset=-1;
670 return(ret);
672 return(0);
676 void activatestrgad(win,gad)
677 struct Window *win;
678 struct Gadget *gad;
680 struct StringInfo *sinfo;
682 sinfo=(struct StringInfo *)gad->SpecialInfo;
683 sinfo->BufferPos=strlen((char *)sinfo->Buffer);
684 RefreshGList(gad,win,NULL,1);
685 ActivateGadget(gad,win,NULL);
688 int __regargs initrequester(struct FileReqData *freqdata)
690 int a,b;
691 struct DOpusFileReq *freq;
692 struct RastPort *rp;
693 struct Screen *screen;
694 struct TextFont *font;
696 freq=freqdata->freq;
697 freq->filearraykey=NULL; freq->filearray=NULL;
698 freqdata->flags=freq->flags;
699 if (freqdata->flags&DFRF_DIRREQ) freqdata->flags&=~DFRF_MULTI;
701 /*if (IntuitionBase->LibNode.lib_Version>35)*/ freqdata->version2=1;
702 screen=(freq->window)?freq->window->WScreen:IntuitionBase->ActiveScreen;
704 freqdata->sfh=screen->RastPort.Font->tf_YSize;
705 freqdata->sfw=screen->RastPort.Font->tf_XSize;
706 if (freqdata->sfh<8) freqdata->sfh=8;
707 if (freqdata->sfw<6) freqdata->sfw=6;
709 if (screen->RastPort.Font->tf_Flags&FPF_PROPORTIONAL)
710 font=GfxBase->DefaultFont;
711 else font=screen->RastPort.Font;
713 freqdata->fh=font->tf_YSize; freqdata->fw=font->tf_XSize;
714 freqdata->fb=font->tf_Baseline;
716 CopyMem((char *)&defaultprop,(char *)&freqdata->filenameprop,sizeof(struct PropInfo));
717 freqdata->filenamesinfo.Buffer=(STRPTR)freq->filebuf;
718 freqdata->filenamesinfo.MaxChars=FILEBUF_SIZE-1;
719 freqdata->drawernamesinfo.Buffer=(STRPTR)freq->dirbuf;
720 freqdata->drawernamesinfo.MaxChars=256-FILEBUF_SIZE/*236*/;
722 if (freq->lines<5) freq->lines=5;
723 else if (freq->lines>((screen->Height-(freqdata->sfh*5)+35)/freqdata->fh))
724 freq->lines=(screen->Height-(freqdata->sfh*5)+35)/freqdata->fh;
726 if (!(freqdata->filetype=AllocMem(sizeof(int)*freq->lines,MEMF_CLEAR)))
727 return(0);
729 CopyMem((char *)&defaultgadgets,(char *)&freqdata->reqgads,sizeof(struct Gadget)*9);
730 CopyMem((char *)&defaulttext,(char *)&freqdata->reqtext,sizeof(struct IntuiText)*6);
731 CopyMem((char *)&defaultimage,(char *)&freqdata->filenameimage,sizeof(struct Image));
732 freqdata->reqgads[0].SpecialInfo=(APTR)&freqdata->filenamesinfo;
733 freqdata->reqgads[1].SpecialInfo=(APTR)&freqdata->drawernamesinfo;
734 freqdata->reqgads[8].GadgetRender=(APTR)&freqdata->filenameimage;
735 freqdata->reqgads[8].SpecialInfo=(APTR)&freqdata->filenameprop;
736 for (a=0;a<8;a++) freqdata->reqgads[a].NextGadget=&freqdata->reqgads[a+1];
737 for (a=0;a<4;a++) freqdata->reqgads[a].GadgetText=&freqdata->reqtext[a];
738 for (a=6;a<8;a++) freqdata->reqgads[a].GadgetText=&freqdata->reqtext[a-2];
739 CopyMem((char *)&defaultwindow,(char *)&freqdata->reqwin,sizeof(struct NewWindow));
740 freqdata->reqwin.Height=(freq->lines*freqdata->fh)+(freqdata->sfh*5)+31+((freqdata->flags&DFRF_DIRREQ)?0:4);
741 if (freqdata->reqwin.Height>screen->Height) {
742 freq->lines=(screen->Height-((freqdata->sfh*5)+35))/freqdata->fh;
743 freqdata->reqwin.Height=(freq->lines*freqdata->fh)+(freqdata->sfh*5)+35;
745 if (freqdata->flags&DFRF_DIRREQ) freqdata->reqwin.Height-=freqdata->sfh+2;
746 freqdata->reqwin.Width=(freqdata->fw*35)+36;
747 if (freqdata->reqwin.Width>screen->Width) {
748 a=(screen->Width-36)/freqdata->fw;
749 freqdata->width=a;
750 freqdata->reqwin.Width=(freqdata->fw*a)+36;
752 else freqdata->width=35;
753 freqdata->ww=freqdata->width*freqdata->fw;
755 freqdata->reqwin.Screen=screen;
756 if (freq->x==-2) freqdata->reqwin.LeftEdge=(screen->Width-freqdata->reqwin.Width)/2;
757 else if (freq->x<0) freqdata->reqwin.LeftEdge=15;
758 else freqdata->reqwin.LeftEdge=freq->x;
759 if (freq->y==-2) freqdata->reqwin.TopEdge=(screen->Height-freqdata->reqwin.Height)/2;
760 else if (freq->y<0) freqdata->reqwin.TopEdge=25;
761 else freqdata->reqwin.TopEdge=freq->y;
762 if (freqdata->reqwin.LeftEdge+freqdata->reqwin.Width>screen->Width)
763 freqdata->reqwin.LeftEdge=screen->Width-freqdata->reqwin.Width;
764 if (freqdata->reqwin.TopEdge+freqdata->reqwin.Height>screen->Height)
765 freqdata->reqwin.TopEdge=screen->Height-freqdata->reqwin.Height;
766 if (freq->title) freqdata->reqwin.Title=(STRPTR)freq->title;
767 else freqdata->reqwin.Title=(STRPTR)string_table[STR_FILEREQ_NAME];
768 if (freqdata->flags&DFRF_SAVE /*&& !freqdata->version2*/) freqdata->reqwin.BlockPen=2;
770 if (!(freqdata->finfo=AllocMem(sizeof(struct FileInfoBlock),MEMF_CLEAR)))
771 return(0);
773 freqdata->oldfileoffset=-1;
775 if (!(freqdata->fr_Window=OpenWindow(&freqdata->reqwin))) return(0);
776 rp=freqdata->fr_Window->RPort;
777 SetFont(rp,font);
778 SetDrMd(rp,JAM2);
779 freqdata->sfy=freqdata->fr_Window->BorderTop+2;
780 freqdata->fy=freqdata->sfy+freqdata->sfh+7;
782 a=freq->lines*freqdata->fh;
783 freqdata->reqgads[1].TopEdge=freqdata->fy+a+5;
784 if (!(freqdata->flags&DFRF_DIRREQ))
785 freqdata->reqgads[0].TopEdge=freqdata->reqgads[1].TopEdge+freqdata->sfh+6;
786 freqdata->reqgads[2].TopEdge=
787 freqdata->reqgads[(freqdata->flags&DFRF_DIRREQ?1:0)].TopEdge+freqdata->sfh+4;
788 freqdata->reqgads[3].TopEdge=freqdata->reqgads[2].TopEdge;
789 freqdata->reqgads[4].TopEdge=freqdata->fy+a-15;
790 freqdata->reqgads[5].TopEdge=freqdata->fy+a-7;
791 freqdata->reqgads[6].TopEdge=freqdata->reqgads[7].TopEdge=freqdata->sfy;
792 freqdata->reqgads[8].TopEdge=freqdata->fy+1;
793 freqdata->reqgads[0].LeftEdge=freqdata->reqgads[1].LeftEdge=(freqdata->sfw*6)+16;
794 freqdata->reqgads[3].LeftEdge=freqdata->reqgads[7].LeftEdge=freqdata->ww-104;
795 freqdata->reqgads[4].LeftEdge=freqdata->reqgads[5].LeftEdge=freqdata->ww+12;
796 freqdata->reqgads[8].LeftEdge=freqdata->ww+16;
797 freqdata->reqgads[0].Width=freqdata->reqgads[1].Width=(freqdata->ww+24)-freqdata->reqgads[0].LeftEdge;
798 if ((freqdata->sfw*6)>132) {
799 freqdata->reqgads[2].Width=freqdata->reqgads[3].Width=
800 freqdata->reqgads[6].Width=freqdata->reqgads[7].Width=
801 freqdata->sfw*7;
802 freqdata->reqgads[3].LeftEdge-=((freqdata->sfw*7)-132);
803 freqdata->reqgads[7].LeftEdge=freqdata->reqgads[3].LeftEdge;
805 freqdata->reqgads[0].Height=freqdata->reqgads[1].Height=freqdata->sfh;
806 freqdata->reqgads[2].Height=freqdata->reqgads[3].Height=
807 freqdata->reqgads[6].Height=freqdata->reqgads[7].Height=freqdata->sfh+4;
808 freqdata->reqgads[8].Height=a-18;
810 for (b=2;b<8;b++)
811 Do3DBox(rp,freqdata->reqgads[b].LeftEdge+2,freqdata->reqgads[b].TopEdge+1,
812 freqdata->reqgads[b].Width-4,freqdata->reqgads[b].Height-2,2,1);
813 if (!(freqdata->flags&DFRF_DIRREQ))
814 Do3DStringBox(rp,freqdata->reqgads[0].LeftEdge,freqdata->reqgads[0].TopEdge,freqdata->reqgads[0].Width,freqdata->sfh,2,1);
815 Do3DStringBox(rp,freqdata->reqgads[1].LeftEdge,freqdata->reqgads[1].TopEdge,freqdata->reqgads[1].Width,freqdata->sfh,2,1);
816 for (b=4;b<6;b++) DoDoArrow(rp,freqdata->ww+14,freqdata->reqgads[b].TopEdge+1,12,6,1,0,b-4);
817 Do3DBox(rp,10,freqdata->fy,freqdata->ww,a,2,1);
818 Do3DBox(rp,freqdata->ww+14,freqdata->fy,12,a-16,2,1);
820 freqdata->reqtext[0].LeftEdge=freqdata->reqtext[1].LeftEdge=-(freqdata->reqgads[0].LeftEdge-10);
821 for (b=2;b<6;b++) freqdata->reqtext[b].LeftEdge=(freqdata->reqgads[2].Width-(freqdata->sfw*6))/2;
823 AddGList(freqdata->fr_Window,&freqdata->reqgads[(freqdata->flags&DFRF_DIRREQ)?1:0],-1,-1,NULL);
824 RefreshGList(&freqdata->reqgads[(freqdata->flags&DFRF_DIRREQ)?1:0],freqdata->fr_Window,NULL,-1);
825 activatefilegad(freqdata);
826 return(1);
829 int __saveds DoFileRequest(register struct DOpusFileReq *freq __asm("a0"))
831 struct Library *AslBase;
833 if (freq->dirbuf[0] && (DoCheckExist(freq->dirbuf,NULL)<0)) {
834 char *ptr;
835 if (ptr=DoBaseName(freq->dirbuf)) {
836 if (freq->filebuf) {
837 int a;
839 LStrnCpy(freq->filebuf,ptr,FILEBUF_SIZE-2);
840 a=strlen(freq->filebuf);
841 if (freq->filebuf[a-1]=='/') freq->filebuf[a-1]=0;
843 *ptr=0;
847 if ((AslBase=OpenLibrary("asl.library",0))) {
848 struct TagItem asltags[10];
849 struct FileRequester *fr;
850 int font,res=FALSE,a;
851 char initialfont[40],*ptr;
852 APTR request;
854 for (a=0;a<10;a++) {
855 asltags[a].ti_Tag=TAG_SKIP;
856 asltags[a].ti_Data=0;
858 asltags[9].ti_Tag=TAG_END;
860 if (freq->flags&DFRF_FONT) font=1;
861 else font=0;
863 if (freq->title) {
864 asltags[0].ti_Tag=ASLFR_TitleText;
865 asltags[0].ti_Data=(IPTR)freq->title;
868 asltags[1].ti_Tag=ASL_Window;
869 asltags[1].ti_Data=(IPTR)((freq->window)?freq->window:IntuitionBase->ActiveWindow);
871 if (freq->x>0) {
872 asltags[2].ti_Tag=ASL_LeftEdge;
873 asltags[2].ti_Data=freq->x;
876 if (freq->y>0) {
877 asltags[3].ti_Tag=ASL_TopEdge;
878 asltags[3].ti_Data=freq->y;
881 asltags[4].ti_Tag=ASL_Height;
882 asltags[4].ti_Data=freq->lines*14;
884 if (font) {
885 if (ptr=DoBaseName(freq->dirbuf)) {
886 LStrCpy(initialfont,ptr);
887 a=strlen(initialfont);
888 if (initialfont[a-1]=='/') initialfont[a-1]=0;
890 else initialfont[0]=0;
891 asltags[5].ti_Tag=ASLFO_InitialName;
892 asltags[5].ti_Data=(IPTR)initialfont;
893 asltags[6].ti_Tag=ASLFO_InitialSize;
894 asltags[6].ti_Data=atoi(freq->filebuf);
896 else {
897 if (freq->filebuf) {
898 asltags[5].ti_Tag=ASL_File;
899 asltags[5].ti_Data=(IPTR)freq->filebuf;
901 if (freq->dirbuf) {
902 asltags[6].ti_Tag=ASL_Dir;
903 asltags[6].ti_Data=(IPTR)freq->dirbuf;
907 asltags[7].ti_Tag=ASL_FuncFlags;
909 if (font) asltags[7].ti_Data=FONF_NEWIDCMP;
910 else {
911 if (freq->flags&DFRF_SAVE) asltags[7].ti_Data=FILF_SAVE|FILF_NEWIDCMP;
912 else if (freq->flags&DFRF_MULTI) asltags[7].ti_Data=FILF_MULTISELECT|FILF_NEWIDCMP;
913 else asltags[7].ti_Data=FILF_NEWIDCMP;
915 if (freq->flags&DFRF_DIRREQ) {
916 asltags[8].ti_Tag=ASL_ExtFlags1;
917 asltags[8].ti_Data|=FIL1F_NOFILES;
921 if (request=AllocAslRequest((font)?ASL_FontRequest:ASL_FileRequest,asltags)) {
922 if (res=AslRequest(request,NULL)) {
923 if (font) {
924 if (freq->dirbuf) {
925 DoStrCombine(freq->dirbuf,"FONTS:",((struct FontRequester *)request)->fo_Attr.ta_Name,256);
926 LStrCat(freq->dirbuf,"/");
928 if (freq->filebuf) {
929 LSprintf(freq->filebuf,"%ld",((struct FontRequester *)request)->fo_Attr.ta_YSize);
932 else {
933 fr=(struct FileRequester *)request;
934 if (freq->dirbuf) LStrCpy(freq->dirbuf,fr->fr_Drawer);
935 if (!(freq->flags&DFRF_DIRREQ)) {
936 if (freq->filebuf) LStrCpy(freq->filebuf,fr->fr_File);
938 if (freq->flags&DFRF_MULTI && fr->fr_NumArgs>0) {
939 if ((freq->filearray=
940 DoAllocRemember(&freq->filearraykey,(fr->fr_NumArgs+1)*4,MEMF_CLEAR))) {
941 for (a=0;a<fr->fr_NumArgs;a++) {
942 if (freq->filearray[a]=DoAllocRemember(&freq->filearraykey,
943 strlen(fr->fr_ArgList[a].wa_Name)+1,MEMF_CLEAR)) {
944 LStrCpy(freq->filearray[a],fr->fr_ArgList[a].wa_Name);
951 FreeAslRequest(request);
953 CloseLibrary(AslBase);
954 return(res);
956 else {
957 ULONG class;
958 UWORD code,gadgetid,qual;
959 struct FileReqData *freqdata;
960 unsigned char *dirbuf;
961 int i,ret=1;
963 if (!(freqdata=AllocMem(sizeof(struct FileReqData),MEMF_CLEAR)))
964 return(ERROR_NOMEM);
965 freqdata->freq=freq;
966 if (!(initrequester(freqdata))) {
967 close_req(freqdata);
968 return(ERROR_NOMEM);
970 dirbuf=freq->dirbuf;
972 if ((i=get_filenames(freqdata))==CANCEL) {
973 close_req(freqdata);
974 freemulti(freq);
975 return(ERROR_CANCEL);
977 if (i!=OKAY) {
978 FOREVER {
979 Wait(1<<freqdata->fr_Window->UserPort->mp_SigBit);
980 while (getintuimsg(freqdata->fr_Window,&class,&code,&qual,&gadgetid)) {
981 if ((i=do_idcmp(freqdata,class,code,qual,gadgetid))==CANCEL) {
982 close_req(freqdata);
983 freemulti(freq);
984 return(ERROR_CANCEL);
986 if (i==OKAY) {
987 close_req(freqdata);
988 goto acceptreq;
993 else close_req(freqdata);
994 acceptreq:
995 checkdrawer(dirbuf);
996 if (freq->flags&DFRF_DIRREQ) {
997 if (i==OKAY || dirbuf[0]) ret=1;
998 else ret=0;
1000 return(ret);