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.
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
};
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
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
;
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
)) {
147 if (file
->select
) ++b
;
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;
155 freq
->filearray
[b
]=&buf
[b
*FILEBUF_SIZE
/*32*/];
156 LStrCpy(freq
->filearray
[b
],file
->name
);
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
;
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;
193 slim
=freqdata
->width
-8;
195 if (nlim
>freqdata
->width
) {
196 nlim
=freqdata
->width
;
200 for (b
=0;b
<freqdata
->freq
->lines
;b
++) {
203 freqdata
->filetype
[b
]=work
->type
;
211 else if (work
->type
>0) SetAPen(rp
,3);
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);
220 else Text(rp
,nullstring
,freqdata
->width
);
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;
236 if (freqdata
->firstfile
) {
238 if (freqdata
->firstdir
) add
=freqdata
->firstdir
;
240 add
=freqdata
->firstfile
;
241 while (add
&& add
->type
>0) add
=add
->next
;
244 else add
=freqdata
->firstfile
;
246 if (LStrCmpI(name
,add
->name
)<=0 ||
247 (type
>0 && add
==freqdata
->firstdir
)) {
248 if (add
->last
) afterdir
=add
->last
;
256 if (!(new=(struct direntry
*)
257 DoAllocRemember(&freqdata
->filekey
,sizeof(struct direntry
),MEMF_CLEAR
)))
270 add
=freqdata
->firstfile
;
274 freqdata
->firstfile
=work
;
277 if (freqdata
->firstfile
) {
278 work
=freqdata
->firstfile
;
279 while (work
->next
) work
=work
->next
;
286 freqdata
->firstfile
=work
;
289 LStrCpy(work
->name
,name
);
290 if (type
==0) LStrCpy(work
->size
,devtypes
[size
]);
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
]);
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
);
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
)
326 if ((i
=strlen(buf
))>1) {
328 if (buf
[i
]!='/' && buf
[i
]!=':') LStrCat(buf
,"/");
332 void __regargs
clearfiles(struct FileReqData
*freqdata
)
334 deallocate_entries(freqdata
);
337 displayfiles(freqdata
);
340 int __regargs
get_filenames(struct FileReqData
*freqdata
)
344 UWORD code
,qual
,gadgetid
;
348 freqdata
->firstfile
=freqdata
->firstdir
=NULL
;
350 if (!(lock
=Lock(freqdata
->freq
->dirbuf
,ACCESS_READ
))) {
351 freqdata
->oldfileoffset
=-1; freqdata
->fileentries
=0;
353 displayfiles(freqdata
);
357 Examine(lock
,freqdata
->finfo
);
358 if (freqdata
->finfo
->fib_DirEntryType
<0) {
360 freqdata
->oldfileoffset
=-1;
361 displayfiles(freqdata
);
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
) {
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;
387 freqdata
->oldfileoffset
=-1;
388 displayfiles(freqdata
);
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
)
406 DoTackOn(freqdata
->freq
->dirbuf
,work
->name
,256);
407 i
=getnewdrawer(freqdata
);
408 if (i
!=OKAY
&& i
!=CANCEL
&& i
!=INTERRUPT
) i
=INTERRUPT
;
412 LStrCpy(freqdata
->freq
->dirbuf
,work
->name
);
413 i
=getnewdrawer(freqdata
);
414 if (i
!=OKAY
&& i
!=CANCEL
&& i
!=INTERRUPT
) i
=INTERRUPT
;
417 if ((LStrCmp(freqdata
->freq
->filebuf
,work
->name
))==0) b
=1;
419 LStrCpy(freqdata
->freq
->filebuf
,work
->name
);
420 RefreshGList(&freqdata
->reqgads
[0],freqdata
->fr_Window
,NULL
,1);
424 int __regargs
listdevices(struct FileReqData
*freqdata
)
427 struct DeviceList
*devlist
;
428 struct RootNode
*rootnode
;
429 struct DosInfo
*dosinfo
;
431 UWORD code
,qual
,gadgetid
;
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
);
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;
457 void __regargs
repeatscroll(struct FileReqData
*freqdata
,int dir
,int menu
)
463 if ((dir
==-1 && freqdata
->fileoffset
==0) ||
464 (dir
==1 && freqdata
->fileoffset
>=freqdata
->fileentries
-freqdata
->freq
->lines
))
466 freqdata
->fileoffset
+=dir
;
467 displayfiles(freqdata
);
469 if (menu
) m
=((freqdata
->freq
->lines
*freqdata
->fh
)/2)+30;
472 if (getintuimsg(freqdata
->fr_Window
,&class,&code
,NULL
,&gadgetid
) &&
473 ((class==GADGETUP
|| (class==MOUSEBUTTONS
&& code
==SELECTUP
)) ||
474 (menu
&& class==MOUSEBUTTONS
&& code
==MENUUP
))) break;
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;
483 if ((dir
==-1 && freqdata
->fileoffset
==0) ||
484 (dir
==1 && freqdata
->fileoffset
>=freqdata
->fileentries
-freqdata
->freq
->lines
))
486 freqdata
->fileoffset
+=dir
;
487 displayfiles(freqdata
);
492 int __regargs
doparent(struct FileReqData
*freqdata
)
496 if ((i
=strlen(freqdata
->freq
->dirbuf
))<2) return(0);
498 if (freqdata
->freq
->dirbuf
[i
]==':') return(0);
499 if (freqdata
->freq
->dirbuf
[i
]=='/') --i
;
501 if (freqdata
->freq
->dirbuf
[b
]=='/') break;
502 if (freqdata
->freq
->dirbuf
[b
]==':') { ++b
; break; }
505 freqdata
->freq
->dirbuf
[b
]=0;
506 RefreshGList(&freqdata
->reqgads
[1],freqdata
->fr_Window
,NULL
,1);
510 struct direntry
* __regargs
getfileentry(struct FileReqData
*freqdata
,int which
)
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);
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
;
525 struct direntry
*file
;
529 case IDCMP_GADGETDOWN
:
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;
543 repeatscroll(freqdata
,-1,0);
546 repeatscroll(freqdata
,1,0);
549 activatefilegad(freqdata
);
560 if (qual
&IEQUALIFIER_LSHIFT
|| qual
&IEQUALIFIER_RSHIFT
) {
561 ActivateStrGad(&freqdata
->reqgads
[1],freqdata
->fr_Window
);
570 refreshdrawergad(freqdata
);
571 if (qual
&IEQUALIFIER_LSHIFT
|| qual
&IEQUALIFIER_RSHIFT
) {
572 activatefilegad(freqdata
);
575 if ((ret
=getnewdrawer(freqdata
))!=OKAY
&& ret
!=CANCEL
&& ret
!=INTERRUPT
)
579 if (doparent(freqdata
)) {
580 if ((ret
=getnewdrawer(freqdata
))!=OKAY
&& ret
!=CANCEL
&& ret
!=INTERRUPT
)
585 activatefilegad(freqdata
);
586 if ((ret
=listdevices(freqdata
))!=OKAY
&& ret
!=CANCEL
&& ret
!=INTERRUPT
)
590 activatefilegad(freqdata
);
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
;
608 freqdata
->fr_Window
->Flags
|=WFLG_REPORTMOUSE
;
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
) {
617 RectFill(rp
,10,ty
,freqdata
->ww
+9,ty
+(freqdata
->fh
-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
;
632 if (!(freqdata
->flags
&DFRF_MULTI
))
633 RectFill(rp
,10,ty
,freqdata
->ww
+9,ty
+(freqdata
->fh
-1));
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
;
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;
652 repeatscroll(freqdata
,b
,1);
654 activatefilegad(freqdata
);
658 activatefilegad(freqdata
);
664 int __regargs
gettingdirmsg(struct FileReqData
*freqdata
,ULONG
class,UWORD code
, UWORD qual
,UWORD gadgetid
)
668 if ((ret
=do_idcmp(freqdata
,class,code
,qual
,gadgetid
))!=-1) {
669 freqdata
->oldfileoffset
=-1;
676 void activatestrgad(win,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
)
691 struct DOpusFileReq
*freq
;
693 struct Screen
*screen
;
694 struct TextFont
*font
;
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
)))
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
;
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
)))
773 freqdata
->oldfileoffset
=-1;
775 if (!(freqdata
->fr_Window
=OpenWindow(&freqdata
->reqwin
))) return(0);
776 rp
=freqdata
->fr_Window
->RPort
;
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
=
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;
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
);
829 int __saveds
DoFileRequest(register struct DOpusFileReq
*freq
__asm("a0"))
831 struct Library
*AslBase
;
833 if (freq
->dirbuf
[0] && (DoCheckExist(freq
->dirbuf
,NULL
)<0)) {
835 if (ptr
=DoBaseName(freq
->dirbuf
)) {
839 LStrnCpy(freq
->filebuf
,ptr
,FILEBUF_SIZE
-2);
840 a
=strlen(freq
->filebuf
);
841 if (freq
->filebuf
[a
-1]=='/') freq
->filebuf
[a
-1]=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
;
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;
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
);
872 asltags
[2].ti_Tag
=ASL_LeftEdge
;
873 asltags
[2].ti_Data
=freq
->x
;
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;
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
);
898 asltags
[5].ti_Tag
=ASL_File
;
899 asltags
[5].ti_Data
=(IPTR
)freq
->filebuf
;
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
;
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
)) {
925 DoStrCombine(freq
->dirbuf
,"FONTS:",((struct FontRequester
*)request
)->fo_Attr
.ta_Name
,256);
926 LStrCat(freq
->dirbuf
,"/");
929 LSprintf(freq
->filebuf
,"%ld",((struct FontRequester
*)request
)->fo_Attr
.ta_YSize
);
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
);
958 UWORD code
,gadgetid
,qual
;
959 struct FileReqData
*freqdata
;
960 unsigned char *dirbuf
;
963 if (!(freqdata
=AllocMem(sizeof(struct FileReqData
),MEMF_CLEAR
)))
966 if (!(initrequester(freqdata
))) {
972 if ((i
=get_filenames(freqdata
))==CANCEL
) {
975 return(ERROR_CANCEL
);
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
) {
984 return(ERROR_CANCEL
);
993 else close_req(freqdata
);
996 if (freq
->flags
&DFRF_DIRREQ
) {
997 if (i
==OKAY
|| dirbuf
[0]) ret
=1;