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.
37 struct ConfigUndo
*undo
;
38 struct DOpusRemember
*key
;
39 struct DOpusListView
*view
;
40 struct dopusfiletype
*type
,*tpos
,*type1
;
41 struct fileclass
*fclass
,classbuf
;
42 int mode
=-1,a
,classchange
=0;
43 char **listptr
,buf
[256],*ptr
;
45 key
=NULL
; type1
=NULL
; firstclass
=NULL
;
46 filetypeactionlist
.items
=NULL
;
47 filetypeactionlist
.topitem
=0;
48 showconfigscreen(CFG_FILETYPE
);
49 ClearMenuStrip(Window
);
50 projectmenu
.NextMenu
=&classmenu
;
51 FSSetMenuStrip(Window
,&projectmenu
);
52 listptr
=makefiletypelist(&key
);
53 undo
=makeundo(UNDO_FILETYPE
);
54 showtypelist(listptr
);
60 Wait(1<<Window
->UserPort
->mp_SigBit
);
61 while (IMsg
=getintuimsg()) {
62 if ((view
=ListViewIDCMP(&filetypeactionlist
,IMsg
))==(struct DOpusListView
*)-1) {
63 class=IMsg
->Class
; code
=IMsg
->Code
;
64 if (class==GADGETUP
|| class==GADGETDOWN
)
65 gadgetid
=((struct Gadget
*)IMsg
->IAddress
)->GadgetID
;
66 ReplyMsg((struct Message
*)IMsg
);
69 if (code
==MENUNULL
) break;
70 switch (MENUNUM(code
)) {
73 showtypelist(listptr
);
77 select_gadget(&maingad
[mode
],0);
81 switch ((a
=ITEMNUM(code
))) {
84 if (doload(CFG_FILETYPE
,a
)) {
85 listptr
=makefiletypelist(&key
);
86 showtypelist(listptr
);
87 if (a
) dogadgetinfo(cfg_string
[STR_NEW_FILETYPES_MERGED
]);
88 else dogadgetinfo(cfg_string
[STR_DEFAULT_FILETYPES_MERGED
]);
94 switch (ITEMNUM(code
)) {
98 classbuf
.recognition
=NULL
;
99 classbuf
.next
=classbuf
.last
=NULL
;
100 if (editclass(&classbuf
,1)) classchange
=1;
103 if (!(fclass
=getfileclasslist(1))) break;
104 if (editclass(fclass
,0)) classchange
=1;
107 if (!(fclass
=getfileclasslist(3))) break;
108 CopyMem((char *)fclass
,(char *)&classbuf
,sizeof(struct fileclass
));
109 classbuf
.recognition
=getcopy(fclass
->recognition
,-1,NULL
);
110 classbuf
.next
=classbuf
.last
=NULL
;
111 if (editclass(&classbuf
,1)) classchange
=1;
114 if (!(fclass
=getfileclasslist(2))) break;
115 lsprintf(buf
,"\"%s\"\n%s",
116 fclass
->type
,cfg_string
[STR_REALLY_DELETE_THIS_CLASS
]);
118 dogadgetinfo(cfg_string
[STR_FILE_CLASS_DELETED
]);
119 removefileclass(fclass
);
122 else dogadgetinfo(NULL
);
125 if (importfileclasses()) classchange
=1;
129 if (savefileclasses()) classchange
=0;
133 if (classname
[0]) strcpy(dirbuf
,classname
);
134 else strcpy(dirbuf
,"PROGDIR:S/DirectoryOpus.CLA");
135 if (ptr
=BaseName(dirbuf
)) {
139 D(bug("filebuf: %s\t%s\n",dirbuf
,filebuf
));
141 filereq
.title
=cfg_string
[STR_ENTER_NAME_TO_SAVE_CLASSES
];
142 filereq
.window
=Window
;
143 if (!(FileRequest(&filereq
))) filebuf
[0]=0;
144 if (!filebuf
[0]) break;
145 strcpy(classname
,dirbuf
);
146 TackOn(classname
,filebuf
,256);
148 if (savefileclasses()) classchange
=0;
152 if (firstclass
&& (request(cfg_string
[STR_ERASE_ALL_CLASSES
]))) {
162 if (gadgetid
<FILETYPE_OKAY
) {
164 showtypelist(listptr
);
167 if (mode
==gadgetid
) {
173 select_gadget(&maingad
[mode
],0);
178 case FILETYPE_CANCEL
:
179 if (classchange
&& !(request(cfg_string
[STR_EXIT_WITHOUT_SAVING_CLASSES
])))
181 if (gadgetid
==FILETYPE_CANCEL
) doundo(undo
,UNDO_FILETYPE
);
183 RemoveListView(&filetypeactionlist
,1);
186 ClearMenuStrip(Window
); projectmenu
.NextMenu
=NULL
;
187 FSSetMenuStrip(Window
,&projectmenu
);
188 return((gadgetid
==FILETYPE_OKAY
));
191 if (!(fclass
=getfileclasslist(0))) break;
194 if (strcmp(type
->type
,fclass
->type
)==0) break;
197 if (!type
|| request(cfg_string
[STR_REDEFINE_EXISTING_CLASS_ACTION
])) {
198 if (type
=AllocMem(sizeof(struct dopusfiletype
),MEMF_CLEAR
)) {
199 strcpy(type
->type
,fclass
->type
);
200 strcpy(type
->typeid,fclass
->typeid);
201 type
->recognition
=getcopy(fclass
->recognition
,-1,&typekey
);
206 if (editfiletype(type
,&key
,1)) {
207 if (tpos
=(struct dopusfiletype
*)
208 getcopy((char *)type
,sizeof(struct dopusfiletype
),&typekey
)) {
209 tpos
->recognition
=getcopy(type
->recognition
,-1,&typekey
);
211 tpos
->function
[a
]=getcopy(type
->function
[a
],-1,&typekey
);
215 FreeMem(type
,sizeof(struct dopusfiletype
));
216 listptr
=makefiletypelist(&key
);
217 showtypelist(listptr
);
222 mode
=doinitfiletypetext(gadgetid
);
227 if (view
->listid
==2) {
228 if (view
->itemselected
>-1) {
230 for (a
=0;a
<view
->itemselected
;a
++,type
=type
->next
)
235 editfiletype(type
,&key
,0);
236 listptr
=makefiletypelist(&key
);
237 showtypelist(listptr
);
241 if (strcmp(type
->type
,"Default")==0)
242 dogadgetinfo(cfg_string
[STR_DEFAULT_ACTION_CAN_NOT_BE_MOVED
]);
243 else if (type
!=type1
) {
244 SwapMem((char *)type
->type
,(char *)type1
->type
,sizeof(struct dopusfiletype
)-4);
245 listptr
=makefiletypelist(&key
);
246 dogadgetinfo(cfg_string
[STR_CLASS_ACTIONS_SWAPPED
]);
248 else dogadgetinfo(NULL
);
249 showtypelist(listptr
);
253 if (strcmp(type
->type
,"Default")==0) {
254 showtypelist(listptr
);
255 dogadgetinfo(cfg_string
[STR_DEFAULT_ACTION_CAN_NOT_BE_MOVED
]);
259 dogadgetinfo(cfg_string
[STR_SELECT_ACTION_TO_SWAP_WITH_FIRST
]);
263 case FILETYPE_DELETE
:
264 if (request(cfg_string
[STR_REALLY_DELETE_THIS_ACTION
])) {
265 if (type
==firsttype
) firsttype
=type
->next
;
269 if (tpos
->next
==type
) {
270 tpos
->next
=type
->next
;
276 dogadgetinfo(cfg_string
[STR_ACTION_DELETED
]);
277 listptr
=makefiletypelist(&key
);
279 else dogadgetinfo(NULL
);
280 showtypelist(listptr
);
291 char **makefiletypelist(key
)
292 struct DOpusRemember
**key
;
296 struct dopusfiletype
*type
;
300 for (count
=0;type
;count
++,type
=type
->next
);
301 if (!(list
=LAllocRemember(key
,(count
+1)*4,MEMF_CLEAR
))) return(NULL
);
303 for (a
=0;a
<count
;a
++) {
304 if (list
[a
]=LAllocRemember(key
,60,MEMF_CLEAR
)) {
305 if (type
->type
[0]) lsprintf(list
[a
],"%-50s%s",type
->type
,type
->typeid);
307 list
[a
][0]=' '; list
[a
][1]=0;
315 void showtypelist(list
)
318 filetypeactionlist
.items
=list
; filetypeactionlist
.itemselected
=-1;
319 RefreshListView(&filetypeactionlist
,1);
322 doinitfiletypetext(id
)
330 dogadgetinfo(cfg_string
[STR_SELECT_ACTION_TO_SWAP
]);
332 case FILETYPE_DELETE
:
333 mode
=FILETYPE_DELETE
;
334 dogadgetinfo(cfg_string
[STR_SELECT_ACTION_TO_DELETE
]);
340 void filetypetitle(type
)
341 struct dopusfiletype
*type
;
345 lsprintf(title
,"%s : %s",cfg_string
[STR_FILETYPE_CLASS
],type
->type
);
346 if (type
->typeid[0]) {
349 lsprintf(extra
," (%s)",type
->typeid);
352 doscreentitle(title
);
355 editfiletype(type
,key
,new)
356 struct dopusfiletype
*type
;
357 struct DOpusRemember
**key
;
360 struct dopusfunction editbuf
;
361 char *func
[FILETYPE_FUNCNUM
],*oldfunc
[FILETYPE_FUNCNUM
];
364 RemoveListView(&filetypeactionlist
,1);
367 editbuf
.function
=NULL
;
368 for (a
=0;a
<FILETYPE_FUNCNUM
;a
++) {
369 oldfunc
[a
]=type
->function
[a
];
370 func
[a
]=getcopy(type
->function
[a
],-1,NULL
);
371 type
->function
[a
]=func
[a
];
373 b
=editfunction(&editbuf
,CFG_FILETYPE
,type
);
376 for (a
=0;a
<FILETYPE_FUNCNUM
;a
++) {
378 freestring(type
->function
[a
]);
379 type
->function
[a
]=func
[a
];
384 for (a
=0;a
<FILETYPE_FUNCNUM
;a
++) {
385 if (b
) func
[a
]=getcopy(type
->function
[a
],-1,&typekey
);
386 else func
[a
]=oldfunc
[a
];
387 freestring(type
->function
[a
]);
388 type
->function
[a
]=func
[a
];
391 showconfigscreen(CFG_FILETYPE
);
396 struct fileclass
*class;
399 struct fileclass editbuf
;
402 makehelpname(cfg_string
[STR_EDIT_CLASS
]);
408 RemoveListView(&filetypeactionlist
,2);
411 doscreentitle(cfg_string
[STR_FILE_CLASS_EDIT_SCREEN
]);
412 strcpy(editbuf
.type
,class->type
);
413 strcpy(editbuf
.typeid,class->typeid);
414 editbuf
.recognition
=getcopy(class->recognition
,-1,NULL
);
415 if ((b
=editfileclass(&editbuf
,new))) {
417 if (!new) removefileclass(class);
418 addfileclass(editbuf
.type
,editbuf
.typeid,editbuf
.recognition
);
421 freestring(class->recognition
);
422 class->recognition
=getcopy(editbuf
.recognition
,-1,NULL
);
423 strcpy(class->type
,editbuf
.type
);
424 strcpy(class->typeid,editbuf
.typeid);
427 if (c
) showconfigscreen(CFG_FILETYPE
);
428 freestring(editbuf
.recognition
);
429 makehelpname((char *)-1);
433 void addfiletype(type
)
434 struct dopusfiletype
*type
;
436 struct dopusfiletype
*tpos
;
438 if (!(tpos
=firsttype
)) firsttype
=type
;
441 if (strcmp(tpos
->next
->type
,"Default")==0) {
442 type
->next
=tpos
->next
;
451 void readfileclasses()
454 int size
,pos
,lsize
,a
;
455 char *classbuf
,buf
[256],*typeid;
457 if ((CheckExist(classname
,&size
))>=0 ||
458 !(classbuf
=AllocMem(size
,MEMF_CLEAR
))) return;
459 if (in
=Open(classname
,MODE_OLDFILE
)) {
460 Read(in
,classbuf
,size
);
464 if ((pos
=readline(classbuf
,pos
,buf
,size
))==-1) break;
466 for (a
=0;buf
[a
];a
++) {
473 for (lsize
=pos
;lsize
<size
;lsize
++) if (!classbuf
[lsize
]) break;
474 if (!(addfileclass(buf
,typeid,&classbuf
[pos
]))) break;
478 FreeMem(classbuf
,size
);
483 int in
,size
,pos
,lsize
,num
,a
,b
,tpos
,ret
=0;
484 char *classbuf
,**classlist
,*classarray
,**classtypeid
,**classrecog
,buf
[256],buf2
[256];
485 struct DOpusRemember
*key
;
488 filereq
.title
=cfg_string
[STR_SELECT_CLASS_FILE_TO_LOAD
];
489 strcpy(dirbuf
,classname
);
490 if (classbuf
=BaseName(dirbuf
)) *classbuf
=0;
492 filereq
.window
=Window
;
493 if (!(FileRequest(&filereq
)) || !filebuf
[0]) return(0);
494 strcpy(buf
,dirbuf
); TackOn(buf
,filebuf
,256);
496 while (!(in
=Open(buf
,MODE_OLDFILE
))) {
497 lsprintf(buf2
,cfg_string
[STR_OPEN_FAILED
],IoErr());
498 if (!(request(buf2
))) return(0);
503 if ((CheckExist(buf
,&size
))>=0 ||
504 !(classbuf
=LAllocRemember(&key
,size
+2,MEMF_CLEAR
))) {
509 Read(in
,classbuf
,size
);
512 for (a
=0,num
=0;a
<size
;a
++) if (!classbuf
[a
]) ++num
;
515 if ((classlist
=LAllocRemember(&key
,(num
+1)*4,MEMF_CLEAR
)) &&
516 (classtypeid
=LAllocRemember(&key
,(num
+1)*4,MEMF_CLEAR
)) &&
517 (classrecog
=LAllocRemember(&key
,(num
+1)*4,MEMF_CLEAR
)) &&
518 (classarray
=LAllocRemember(&key
,num
+1,MEMF_CLEAR
))) {
522 if ((pos
=readline(classbuf
,pos
,buf
,size
))==-1) break;
523 classlist
[a
]=&classbuf
[tpos
];
525 for (b
=0;buf
[b
];b
++) {
528 classtypeid
[a
]=&classbuf
[tpos
+b
+1];
534 classrecog
[a
++]=&classbuf
[tpos
+b
+1];
535 for (lsize
=tpos
+b
+1;lsize
<size
;lsize
++)
536 if (!classbuf
[lsize
]) break;
540 (dolistwindow(cfg_string
[STR_SELECT_CLASSES_TO_IMPORT
],332,72,
541 classlist
,DLVF_MULTI
|DLVF_HIREC
,classarray
,NULL
))) {
542 for (a
=0;a
<num
;a
++) {
544 if (!(addfileclass(classlist
[a
],classtypeid
[a
],classrecog
[a
]))) break;
556 struct fileclass
*fclass
;
559 char f
=0,g
=1,buf
[100];
561 if (!firstclass
) return(1);
562 if (!classname
[0]) strcpy(classname
,"PROGDIR:S/DirectoryOpus.CLA");
563 D(bug("classname: %s\n",classname
));
564 while (!(out
=Open(classname
,MODE_NEWFILE
))) {
565 lsprintf(buf
,cfg_string
[STR_SAVE_FAILED
],IoErr());
566 if (!(request(buf
))) return(0);
570 if (fclass
->type
[0]) {
571 if ((Write(out
,fclass
->type
,(a
=strlen(fclass
->type
))))<a
) break;
572 if (fclass
->typeid[0]) {
574 if ((Write(out
,fclass
->typeid,(a
=strlen(fclass
->typeid))))<a
) break;
578 if (fclass
->recognition
) {
579 if ((Write(out
,fclass
->recognition
,(a
=(strlen(fclass
->recognition
)+1))))<a
)
582 else Write(out
,&f
,1);
589 addfileclass(type
,typeid,recog
)
590 char *type
,*typeid,*recog
;
592 struct fileclass
*fclass
,*newclass
,*last
;
596 if (LStrCmpI(fclass
->type
,type
)>=0) break;
597 if (!fclass
->next
) last
=fclass
;
600 if (!(newclass
=AllocMem(sizeof(struct fileclass
),MEMF_CLEAR
))) return(0);
603 fclass
->last
->next
=newclass
;
604 newclass
->last
=fclass
->last
;
606 else if (fclass
==firstclass
) firstclass
=newclass
;
607 newclass
->next
=fclass
;
608 fclass
->last
=newclass
;
610 else if (firstclass
) {
614 else firstclass
=newclass
;
615 strcpy(newclass
->type
,type
);
616 strcpy(newclass
->typeid,typeid);
617 if (recog
&& (newclass
->recognition
=AllocMem(strlen(recog
)+1,MEMF_CLEAR
)))
618 strcpy(newclass
->recognition
,recog
);
622 void freefileclasses()
624 struct fileclass
*fclass
,*newclass
;
628 newclass
=fclass
->next
;
629 freestring(fclass
->recognition
);
630 FreeMem(fclass
,sizeof(struct fileclass
));
636 void removefileclass(fclass
)
637 struct fileclass
*fclass
;
639 if (fclass
->last
) fclass
->last
->next
=fclass
->next
;
640 if (fclass
->next
) fclass
->next
->last
=fclass
->last
;
641 if (fclass
==firstclass
) firstclass
=fclass
->next
;
642 freestring(fclass
->recognition
);
643 FreeMem(fclass
,sizeof(struct fileclass
));
646 char **makeclasslist(key
)
647 struct DOpusRemember
**key
;
651 struct fileclass
*fclass
;
654 if (!firstclass
) return(NULL
);
656 for (count
=0;fclass
;count
++,fclass
=fclass
->next
);
657 if (!(list
=LAllocRemember(key
,(count
+1)*4,MEMF_CLEAR
))) return(NULL
);
659 for (a
=0;a
<count
;a
++) {
660 if (list
[a
]=LAllocRemember(key
,40,MEMF_CLEAR
)) strcpy(list
[a
],fclass
->type
);
666 readline(buf
,pos
,buf1
,size
)
674 for (a
=0;a
<256;a
++) {
675 if (size
==pos
|| buf
[pos
]==0) {
677 if (size
==pos
) return(-1);
687 editfileclass(fclass
,new)
688 struct fileclass
*fclass
;
691 int a
,b
,old
,selitem
,lasta
=-1,x
,y
,mx
,my
,off
,temp
,waitbits
,remapp
=0,char_w
;
692 ULONG
class,sec
,mic
,oldsec
,oldmic
;
693 UWORD code
,gadgetid
,qual
;
695 struct DOpusListView
*view
;
696 struct DOpusRemember
*key
=NULL
;
698 *classlist
[MAXFUNCS
+1],classtype
[MAXFUNCS
],*displist
[MAXFUNCS
+1],
699 *templist
,temptype
,buf
[16];
702 for (a
=0;a
<MAXFUNCS
;a
++) {
703 displist
[a
]=LAllocRemember(&key
,80,MEMF_CLEAR
);
706 makeeditclasslist(fclass
,classlist
,classtype
);
707 dispclasslist(classlist
,classtype
,displist
);
709 namesinfo
.MaxChars
=32;
710 strcpy(edit_namebuf
,fclass
->type
);
711 strcpy(edit_typeidbuf
,fclass
->typeid);
712 edit_funcbuf
[0]=0; edit_pathbuf
[0]=0;
713 editclassgadgets
[4].Flags
&=~SELECTED
;
715 AddGadgetBorders(&key
,
716 &editclassgadgets
[2],
718 screen_pens
[config
->gadgettopcol
].pen
,screen_pens
[config
->gadgetbotcol
].pen
);
719 AddGadgetBorders(&key
,
720 &editclassgadgets
[6],
722 screen_pens
[config
->gadgettopcol
].pen
,screen_pens
[config
->gadgetbotcol
].pen
);
723 AddGadgetBorders(&key
,
724 &editclassgadgets
[10],
726 screen_pens
[config
->gadgettopcol
].pen
,screen_pens
[config
->gadgetbotcol
].pen
);
727 AddGadgetBorders(&key
,
728 &editclassgadgets
[12],
730 screen_pens
[config
->gadgettopcol
].pen
,screen_pens
[config
->gadgetbotcol
].pen
);
732 SetAPen(rp
,screen_pens
[1].pen
);
737 screen_pens
[config
->gadgettopcol
].pen
,screen_pens
[config
->gadgetbotcol
].pen
,1);
738 doglassimage(&editclassgadgets
[6]);
739 doglassimage(&editclassgadgets
[8]);
743 screen_pens
[config
->gadgetbotcol
].pen
,screen_pens
[config
->gadgettopcol
].pen
);
745 fileview_buf
=NULL
; fileview_lines
=fileview_topline
=0; fileview_type
=1;
746 char_w
= rp
->Font
->tf_XSize
;
751 setuplist(&editclasslist
,7,88);
752 editclasslist
.topitem
=0; editclasslist
.itemselected
=-1;
753 editclasslist
.items
=displist
;
754 AddListView(&editclasslist
,1);
755 initsidegads(editfuncgads
,0,0);
756 ClearMenuStrip(Window
);
757 Window
->Flags
|=WFLG_RMBTRAP
;
759 if (new) ActivateStrGad(&editclassgadgets
[0],Window
);
767 waitbits
=1<<Window
->UserPort
->mp_SigBit
;
768 if (appobject
) waitbits
|=1<<appport
->mp_SigBit
;
772 while (appmsg
=(struct AppMessage
*)GetMsg(appport
)) {
773 ActivateWindow(Window
);
774 if (appmsg
->am_ID
==MY_APPOBJECT
&&
775 appmsg
->am_NumArgs
>0 &&
776 (*appmsg
->am_ArgList
[0].wa_Name
)) {
777 PathName(appmsg
->am_ArgList
[0].wa_Lock
,edit_pathbuf
,256);
778 TackOn(edit_pathbuf
,appmsg
->am_ArgList
[0].wa_Name
,256);
779 RefreshStrGad(&editclassgadgets
[9],Window
);
782 ReplyMsg((struct Message
*)appmsg
);
785 while (IMsg
=getintuimsg()) {
786 if ((view
=ListViewIDCMP(&editclasslist
,IMsg
))==(struct DOpusListView
*)-1) {
787 class=IMsg
->Class
; code
=IMsg
->Code
; qual
= IMsg
->Qualifier
;
788 mx
=IMsg
->MouseX
; my
=IMsg
->MouseY
;
789 sec
=IMsg
->Seconds
; mic
=IMsg
->Micros
;
790 if (class==IDCMP_GADGETUP
|| class==IDCMP_GADGETDOWN
) {
791 gad
=(struct Gadget
*)IMsg
->IAddress
;
792 gadgetid
=gad
->GadgetID
;
794 ReplyMsg((struct Message
*)IMsg
);
796 case IDCMP_MOUSEBUTTONS
:
797 if (code
!=SELECTDOWN
||
798 mx
<x_off
+11 || mx
>x_off
+505 ||
799 my
<y_off
+21 || my
>x_off
+68) break;
800 if (oldsec
&& DoubleClick(oldsec
,oldmic
,sec
,mic
)) off
=1;
802 oldsec
=sec
; oldmic
=mic
;
804 if (my
>y_off
+20 && my
<y_off
+69) {
806 x
=((mx
-x_off
-11)/char_w
)-10;
810 a
=x
/9; x
=(a
*4)+((x
%9)/2);
817 y
=((my
-y_off
-21)/8)+fileview_topline
;
818 if (y
<fileview_topline
) y
=fileview_topline
;
822 if (a
==fileview_position
) {
824 if ((fileview_offset
=a
)<0 ||
825 fileview_offset
>=fileview_size
) fileview_offset
=-1;
834 old
=fileview_position
;
835 if ((fileview_position
=(y
*16)+x
)<0 ||
836 fileview_position
>=fileview_size
) fileview_position
=-1;
837 a
=fileview_position
; b
=0;
838 if (fileview_offset
>fileview_position
) show_view_number(-1,1);
839 else if (fileview_offset
>-1)
840 show_view_number(fileview_position
-fileview_offset
,1);
842 if (a
>-1 && a
!=old
) {
845 show_view_number(a
,b
);
850 while (IMsg
=getintuimsg()) {
851 if (IMsg
->Class
==IDCMP_MOUSEMOVE
|| IMsg
->Class
==IDCMP_MOUSEBUTTONS
)
852 class=IMsg
->Class
; code
=IMsg
->Code
;
853 ReplyMsg((struct Message
*)IMsg
);
854 if (class==IDCMP_MOUSEBUTTONS
&& code
==SELECTUP
) break;
856 if (class==IDCMP_MOUSEBUTTONS
&& code
==SELECTUP
) break;
861 if (fileview_topline
>0) {
862 --fileview_topline
; fileview_oldtop
=fileview_position
=-1;
864 FixSliderPot(Window
,&editclassgadgets
[11],fileview_topline
,fileview_lines
,6,1);
867 else if (my
>y_off
+68) {
869 if (fileview_topline
<fileview_lines
-6) {
870 ++fileview_topline
; fileview_oldtop
=fileview_position
=-1;
872 FixSliderPot(Window
,&editclassgadgets
[11],fileview_topline
,fileview_lines
,6,1);
875 else if (class!=IDCMP_MOUSEMOVE
) Wait(1<<Window
->UserPort
->mp_SigBit
);
882 if (fileview_position
>15) cursor_fileview(-16);
885 if (fileview_position
<fileview_size
-16) cursor_fileview(16);
888 if (fileview_position
) cursor_fileview(-1);
891 if (fileview_position
<fileview_size
-1) cursor_fileview(1);
896 RawkeyToStr(code
,qual
,NULL
,buf
,10);
897 c
= LToLower(buf
[0]);
898 if (c
== getkeyshortcut(cfg_string
[STR_EDITCLASS_FILECLASS
]))
899 ActivateStrGad(&editclassgadgets
[0],Window
);
900 else if (c
== getkeyshortcut(cfg_string
[STR_EDITCLASS_CLASSID
]))
901 ActivateStrGad(&editclassgadgets
[1],Window
);
902 else if (c
== getkeyshortcut(cfg_string
[STR_EDITCLASS_FILEVIEWER
]))
908 case IDCMP_GADGETDOWN
:
912 case CLASS_VIEWSLIDER
:
915 if (gadgetid
==CLASS_VIEWUP
) {
916 if (fileview_topline
==0) break;
919 else if (gadgetid
==CLASS_VIEWDOWN
) {
920 if (fileview_topline
>=fileview_lines
-6) break;
924 fileview_topline
=GetSliderPos(&editclassgadgets
[11],fileview_lines
,6);
926 if (fileview_topline
!=fileview_oldtop
) show_file_view();
927 if (gadgetid
!=CLASS_VIEWSLIDER
) {
928 FixSliderPot(Window
,&editclassgadgets
[11],fileview_topline
,fileview_lines
,6,1);
929 if (!temp
++) Delay(10);
931 while (IMsg
=getintuimsg()) {
932 class=IMsg
->Class
; code
=IMsg
->Code
;
933 ReplyMsg((struct Message
*)IMsg
);
934 if (class==IDCMP_MOUSEBUTTONS
&& code
==SELECTUP
)
935 class=IDCMP_GADGETUP
;
936 if (class==IDCMP_GADGETUP
) break;
938 if (class==IDCMP_GADGETUP
) break;
940 ShowSlider(Window
,&editclassgadgets
[11]);
948 makeclassrecog(fclass
,classlist
,classtype
);
949 strcpy(fclass
->type
,edit_namebuf
);
950 strcpy(fclass
->typeid,edit_typeidbuf
);
952 if (editclassgadgets
[3].Flags
&GFLG_DISABLED
) seteditclassgads(1);
953 RemoveListView(&editclasslist
,1);
955 freefunclist(classlist
);
956 Window
->Flags
&=~WFLG_RMBTRAP
;
957 FSSetMenuStrip(Window
,&projectmenu
);
958 if (remapp
) rem_appobject(0);
959 return((gadgetid
==CLASS_OKAY
));
961 case CLASS_OPERATION
:
963 if ((a
=funcrequester(FREQ_FILETYPE
,
964 NULL
,cfg_string
[STR_LIST_OF_FILETYPE_COMMANDS
]))) {
965 classtype
[selitem
]=a
;
966 showclassop(classtype
[selitem
]);
967 ActivateStrGad(&editclassgadgets
[7],Window
);
972 edit_funcbuf
[0]=0; classtype
[selitem
]=0;
979 if (gadgetid
==CLASS_NEWENTRY
&& !edit_funcbuf
[0]) {
980 ActivateStrGad(&editclassgadgets
[7],Window
);
983 editclasslist
.itemselected
=-1;
984 if (!edit_funcbuf
[0]) lasta
=-1;
985 endclassedit(selitem
,classlist
,classtype
,displist
);
986 if (lasta
==-1) a
=selitem
;
990 if (gadgetid
==CLASS_NEWENTRY
) {
991 if (editclasslist
.count
>=MAXFUNCS
) break;
994 selitem
=editclasslist
.count
;
997 insertnewclass(classlist
,classtype
,selitem
,displist
," ",2);
1000 else seteditclassgads(0);
1003 case CLASS_DUPLICATE
:
1005 if (editclasslist
.count
>=MAXFUNCS
|| !edit_funcbuf
[0]) {
1006 ActivateStrGad(&editclassgadgets
[7],Window
);
1009 editclasslist
.itemselected
=-1;
1010 endclassedit(selitem
,classlist
,classtype
,displist
);
1011 a
=selitem
; selitem
=editclasslist
.count
;
1012 insertnewclass(classlist
,classtype
,selitem
,displist
,classlist
[a
],classtype
[a
]);
1015 case CLASS_FILEVIEWREQ
:
1017 if (!(funcrequester(FREQ_GENERIC
,edit_pathbuf
,NULL
))) break;
1018 RefreshStrGad(&editclassgadgets
[9],Window
);
1019 case CLASS_FILEVIEW
:
1020 if (code
!=0x9) load_file_view();
1023 fileview_type
=1-fileview_type
;
1024 DoCycleGadget(&editclassgadgets
[10],Window
,fileview_types
,fileview_type
);
1025 show_view_number(fileview_position
,0);
1026 if (fileview_offset
>fileview_position
) show_view_number(-1,1);
1027 else if (fileview_offset
>-1)
1028 show_view_number(fileview_position
-fileview_offset
,1);
1031 ActivateStrGad(&editclassgadgets
[1],Window
);
1034 StrToUpper(edit_typeidbuf
,edit_typeidbuf
);
1035 RefreshStrGad(&editclassgadgets
[1],Window
);
1044 endclassedit(selitem
,classlist
,classtype
,displist
);
1045 if (editclassgadgets
[4].Flags
&SELECTED
) {
1047 seteditclassgads(0);
1048 templist
=classlist
[selitem
];
1049 classlist
[selitem
]=classlist
[view
->itemselected
];
1050 classlist
[view
->itemselected
]=templist
;
1051 temptype
=classtype
[selitem
];
1052 classtype
[selitem
]=classtype
[view
->itemselected
];
1053 classtype
[view
->itemselected
]=temptype
;
1054 dispclasslist(classlist
,classtype
,displist
);
1055 editclasslist
.itemselected
=-1;
1056 RefreshListView(&editclasslist
,1);
1061 else seteditclassgads(1);
1062 selitem
=view
->itemselected
;
1063 if (classlist
[selitem
]) strcpy(edit_funcbuf
,classlist
[selitem
]);
1064 else edit_funcbuf
[0]=0;
1065 //kprintf("selitem: %ld\tedit_funcbuf: %s\n",selitem,edit_funcbuf);
1066 RefreshStrGad(&editclassgadgets
[7],Window
);
1067 showclassop(classtype
[selitem
]);
1068 ActivateStrGad(&editclassgadgets
[7],Window
);
1077 void makeeditclasslist(class,classlist
,classtype
)
1078 struct fileclass
*class;
1079 char **classlist
,*classtype
;
1081 int a
,b
,len
,type
,pos
,num
;
1084 if (!class->recognition
) return;
1085 len
=strlen(class->recognition
);
1087 for (a
=0;a
<=len
;a
++) {
1089 if (class->recognition
[a
]<FTYC_COMMANDOK
) {
1090 type
=class->recognition
[a
];
1093 if (class->recognition
[a
]>FTYC_ENDLIMIT
&&
1094 class->recognition
[a
]<FTYC_ENDSECTION
) {
1096 classlist
[num
]=getcopy(" ",2,NULL
);
1097 for (b
=0;b
<12;b
++) {
1098 if (classopvals
[b
]==class->recognition
[a
]) {
1103 if ((++num
)==MAXFUNCS
) break;
1106 else if (pos
==255 || class->recognition
[a
]>FTYC_ENDLIMIT
||
1107 !class->recognition
[a
]) {
1109 if (classlist
[num
]=getcopy(buf
,-1,NULL
)) {
1110 for (b
=0;b
<12;b
++) {
1111 if (classopvals
[b
]==type
) {
1116 if ((++num
)==MAXFUNCS
) break;
1119 if (class->recognition
[a
]>FTYC_ENDLIMIT
&&
1120 class->recognition
[a
]<FTYC_ENDSECTION
) goto doandor
;
1122 else buf
[pos
++]=class->recognition
[a
];
1124 for (a
=num
;a
<MAXFUNCS
;a
++) classlist
[a
]=NULL
;
1127 void dispclasslist(classlist
,classtype
,displist
)
1128 char **classlist
,*classtype
,**displist
;
1133 for (a
=0;a
<MAXFUNCS
;a
++) {
1134 if (!classlist
[a
]) break;
1135 strcpy(buf
,classopslist
[classtype
[a
]-1]);
1136 ptr
=strchr(buf
,' '); *ptr
=0;
1137 StrCombine(displist
[a
],buf
,spacestring
,15);
1138 if (classopvals
[classtype
[a
]-1]<FTYC_COMMANDOK
) StrConcat(displist
[a
],classlist
[a
],75);
1140 for (;a
<MAXFUNCS
;a
++) displist
[a
][0]=0;
1143 void seteditclassgads(on
)
1149 for (a
=3;a
<6;a
++) EnableGadget(&editclassgadgets
[a
],rp
,4,2);
1150 EnableGadget(&editclassgadgets
[6],rp
,4,2);
1151 EnableGadget(&editclassgadgets
[7],rp
,0,0);
1154 for (a
=3;a
<6;a
++) DisableGadget(&editclassgadgets
[a
],rp
,4,2);
1155 DisableGadget(&editclassgadgets
[6],rp
,4,2);
1156 DisableGadget(&editclassgadgets
[7],rp
,0,0);
1160 void removeclassentry(classlist
,classtype
,entry
)
1161 char **classlist
,*classtype
;
1164 if (entry
<MAXFUNCS
-1) {
1165 CopyMem(&classlist
[entry
+1],&classlist
[entry
],(MAXFUNCS
-1-entry
)*4);
1166 CopyMem(&classtype
[entry
+1],&classtype
[entry
],(MAXFUNCS
-1-entry
));
1168 classlist
[MAXFUNCS
-1]=NULL
;
1171 void insertnewclass(classlist
,classtype
,entry
,displist
,string
,type
)
1172 char **classlist
,*classtype
;
1174 char **displist
,*string
;
1177 char *templist
[MAXFUNCS
],temptype
[MAXFUNCS
];
1181 CopyMem(&classlist
[entry
],templist
,a
*4);
1182 CopyMem(templist
,&classlist
[entry
+1],a
*4);
1183 classlist
[entry
]=getcopy(string
,-1,NULL
);
1184 CopyMem(&classtype
[entry
],temptype
,a
);
1185 CopyMem(temptype
,&classtype
[entry
+1],a
);
1186 classtype
[entry
]=type
;
1187 dispclasslist(classlist
,classtype
,displist
);
1188 if (entry
<editclasslist
.topitem
||
1189 entry
>=editclasslist
.topitem
+editclasslist
.lines
) editclasslist
.topitem
=entry
;
1190 editclasslist
.itemselected
=entry
;
1191 RefreshListView(&editclasslist
,1);
1192 if (string
[0]==' ' && string
[1]==0) edit_funcbuf
[0]=0;
1193 else strcpy(edit_funcbuf
,string
);
1194 RefreshStrGad(&editclassgadgets
[7],Window
);
1196 ActivateStrGad(&editclassgadgets
[7],Window
);
1199 void endclassedit(item
,classlist
,classtype
,displist
)
1201 char **classlist
,*classtype
,**displist
;
1203 //kprintf("classtype[item]: %ld\tbuf: %s\n",classtype[item],edit_funcbuf);
1204 freestring(classlist
[item
]);
1205 if (classtype
[item
]<1 || classopvals
[classtype
[item
]-1]<FTYC_COMMANDOK
) {
1206 if (edit_funcbuf
[0]) classlist
[item
]=getcopy(edit_funcbuf
,-1,NULL
);
1207 else removeclassentry(classlist
,classtype
,item
);
1209 else classlist
[item
]=getcopy(" ",2,NULL
);
1210 dispclasslist(classlist
,classtype
,displist
);
1211 RefreshListView(&editclasslist
,1);
1213 RefreshStrGad(&editclassgadgets
[7],Window
);
1217 void makeclassrecog(class,classlist
,classtype
)
1218 struct fileclass
*class;
1219 unsigned char **classlist
,*classtype
;
1222 unsigned char *buf
,buf2
[2];
1225 for (a
=0;a
<MAXFUNCS
;a
++) {
1226 if (!classlist
[a
]) break;
1227 size
+=strlen(classlist
[a
])+2;
1230 freestring(class->recognition
); class->recognition
=NULL
;
1232 if (!(buf
=AllocMem(size
+2,MEMF_CLEAR
))) return;
1234 for (a
=0;a
<num
;a
++) {
1235 buf2
[0]=classopvals
[classtype
[a
]-1];
1237 if (buf2
[0]<FTYC_COMMANDOK
) {
1238 strcat(buf
,classlist
[a
]);
1239 if (a
==(num
-1) || classopvals
[classtype
[a
+1]-1]<FTYC_COMMANDOK
) {
1240 buf2
[0]=FTYC_ENDSECTION
;
1245 class->recognition
=getcopy(buf
,-1,NULL
);
1246 FreeMem(buf
,size
+2);
1249 void checkclassswap()
1251 if (editclassgadgets
[4].Flags
&SELECTED
) {
1252 editclassgadgets
[4].Flags
&=~SELECTED
;
1253 select_gadget(&editclassgadgets
[4],0);
1257 void showclassop(op
)
1263 SetAPen(rp
,screen_pens
[0].pen
);
1266 x_off
+152,y_off
+151);
1267 SetAPen(rp
,screen_pens
[1].pen
);
1268 if (op
<1) ptr
="----";
1270 strcpy(str
,classopslist
[op
-1]);
1271 ptr
=strchr(str
,' '); *ptr
=0;
1275 x
=((116-(a
*8))/2)+x_off
+37;
1276 Move(rp
,x
,y_off
+148);
1280 struct fileclass
*getfileclasslist(type
)
1283 struct DOpusRemember
*key
=NULL
;
1285 struct fileclass
*fclass
=NULL
;
1287 fileclasslist
=makeclasslist(&key
);
1288 if ((a
=funcrequester(FREQ_FILECLASS
,NULL
,fileclasstype
[type
]))) {
1290 while ((--a
) && fclass
&& fclass
->next
) fclass
=fclass
->next
;
1292 LFreeRemember(&key
);
1296 void draw_file_view()
1300 SetAPen(rp
,screen_pens
[0].pen
);
1303 x_off
+511,y_off
+68);
1304 do3dbox(x_off
+7,y_off
+21,505,48);
1308 screen_pens
[config
->gadgetbotcol
].pen
,screen_pens
[config
->gadgettopcol
].pen
);
1312 screen_pens
[config
->gadgetbotcol
].pen
,screen_pens
[config
->gadgettopcol
].pen
);
1313 SetAPen(rp
,screen_pens
[1].pen
);
1315 cfg_string
[STR_POSITION
],
1319 cfg_string
[STR_OFFSET
],
1324 editclassgadgets
[12+a
].LeftEdge
+2,editclassgadgets
[12+a
].TopEdge
+1,
1326 screen_pens
[1].pen
,screen_pens
[0].pen
,a
);
1327 fix_slider(&editclassgadgets
[11]);
1328 FixSliderBody(Window
,&editclassgadgets
[11],fileview_lines
,6,0);
1329 FixSliderPot(Window
,&editclassgadgets
[11],fileview_topline
,fileview_lines
,6,0);
1330 ShowSlider(Window
,&editclassgadgets
[11]);
1331 DoCycleGadget(&editclassgadgets
[10],Window
,fileview_types
,fileview_type
);
1334 void free_file_view()
1339 FreeMem(fileview_buf
,fileview_size
);
1342 fileview_size
=fileview_lines
=fileview_topline
=0;
1343 fileview_oldtop
=fileview_offset
=fileview_position
=-1;
1344 for (a
=0;a
<2;a
++) show_view_number(-1,a
);
1347 void load_file_view()
1354 if ((CheckExist(edit_pathbuf
,&fileview_size
))<0 &&
1355 (file
=Open(edit_pathbuf
,MODE_OLDFILE
))) {
1356 if (fileview_size
>4096) fileview_size
=4096;
1357 else if (fileview_size
%16) fileview_size
=((fileview_size
+15)/16)*16;
1358 if (fileview_buf
=AllocMem(fileview_size
,MEMF_CLEAR
)) {
1359 rsize
=Read(file
,fileview_buf
,fileview_size
);
1360 fileview_lines
=(rsize
+15)/16;
1365 if (!fileview_buf
) {
1367 file_view_text(cfg_string
[STR_FILE_NOT_FOUND
],0);
1369 else show_file_view();
1373 void file_view_text(txt
,line
)
1379 SetAPen(rp
,screen_pens
[1].pen
);
1380 SetBPen(rp
,screen_pens
[0].pen
);
1381 Move(rp
,x_off
+9,y_off
+27+(line
*8));
1382 if (txt
) Text(rp
,txt
,(len
=strlen(txt
)));
1384 if (len
<62) Text(rp
,spacestring
,62-len
);
1387 void show_file_view(void)
1389 int line
,a
,off
,old
,top
,bottom
,scroll
,ox
,px
,aox
,apx
,char_w
;
1390 char buf
[80],buf2
[30];
1392 top
=0; bottom
=5; scroll
=0;
1393 if (fileview_oldtop
>-1) {
1394 if ((a
=fileview_topline
-fileview_oldtop
)>0 && a
<6) {
1398 else if (a
<0 && a
>-6) {
1403 char_w
= rp
->Font
->tf_XSize
;
1406 for (line
=0;line
<6;line
++) {
1407 if (line
>=top
&& line
<=bottom
) {
1409 ScrollRaster(rp
,0,scroll
,x_off
+7,y_off
+21,x_off
+511,y_off
+68);
1412 if (fileview_lines
<=line
+fileview_topline
) file_view_text(NULL
,line
);
1414 off
=(fileview_topline
+line
)*16;
1415 lsprintf(buf
,"%08lx: ",off
);
1418 /* lsprintf(buf2,"%02lx%02lx%02lx%02lx ",
1419 fileview_buf[off++],fileview_buf[off++],fileview_buf[off++],fileview_buf[off++]);
1421 lsprintf(buf2
,"%08lx ",*((long *)(fileview_buf
+off
)));
1425 if (px
==-1 && fileview_position
>=off
-4 && fileview_position
<off
) {
1426 apx
=fileview_position
-(off
-4);
1427 px
=(a
*9)+(apx
*2); apx
+=(a
*4)+36;
1429 if (ox
==-1 && fileview_offset
>=off
-4 && fileview_offset
<off
) {
1430 aox
=fileview_offset
-(off
-4);
1431 ox
=(a
*9)+(aox
*2); aox
+=(a
*4)+36;
1435 for (a
=0;a
<16;a
++,off
++)
1436 buf
[46+a
]=(isprint(fileview_buf
[off
]))?fileview_buf
[off
]:'.';
1438 file_view_text(buf
,line
);
1439 if (px
>-1 && px
!=ox
) {
1440 SetDrMd(rp
,COMPLEMENT
);
1442 x_off
+9+(10+px
)*char_w
,y_off
+21+(line
*8),
1443 x_off
+8+(12+px
)*char_w
,y_off
+28+(line
*8));
1445 x_off
+9+(10+apx
)*char_w
,y_off
+21+(line
*8),
1446 x_off
+8+(11+apx
)*char_w
,y_off
+28+(line
*8));
1450 SetAPen(rp
,screen_pens
[2].pen
);
1451 lsprintf(buf2
,"%02lx",fileview_buf
[fileview_offset
]);
1452 Move(rp
,x_off
+9+(10+ox
)*char_w
,y_off
+27+(line
*8));
1454 buf2
[0]=(isprint(fileview_buf
[fileview_offset
])?fileview_buf
[fileview_offset
]:'.');
1455 Move(rp
,x_off
+9+(10+aox
)*char_w
,y_off
+27+(line
*8));
1457 SetAPen(rp
,screen_pens
[1].pen
);
1462 fileview_oldtop
=fileview_topline
;
1465 void show_view_number(num
,pos
)
1472 SetAPen(rp
,screen_pens
[0].pen
);
1474 x_off
+534,y_off
+31+(26*pos
),
1475 x_off
+624,y_off
+42+(26*pos
));
1476 SetAPen(rp
,screen_pens
[1].pen
);
1479 y
=y_off
+39+(26*pos
);
1480 if (fileview_type
==0) lsprintf(buf
,"$%08lx",num
);
1481 else lsprintf(buf
,"%09ld",num
);
1482 UScoreText(rp
,buf
,x_off
+543,y
,-1);
1486 void cursor_fileview(delta
)
1491 fileview_position
+=delta
;
1492 if (fileview_position
<0) fileview_position
=0;
1493 else if (fileview_position
>=fileview_size
) fileview_position
=fileview_size
-1;
1495 if (fileview_position
<(fileview_topline
*16)) {
1497 while (fileview_position
<(fileview_topline
*16)) {
1498 if (!fileview_topline
) break;
1503 else if (fileview_position
>=((fileview_topline
+6)*16)) {
1505 while (fileview_position
>=((fileview_topline
+6)*16)) {
1506 if (fileview_topline
>=fileview_lines
-6) break;
1512 show_view_number(fileview_position
,0);
1513 if (fileview_offset
>fileview_position
) show_view_number(-1,1);
1514 else if (fileview_offset
>-1)
1515 show_view_number(fileview_position
-fileview_offset
,1);
1516 if (ups
) FixSliderPot(Window
,&editclassgadgets
[11],fileview_topline
,fileview_lines
,6,1);