Missing dependencies added.
[AROS-Contrib.git] / dopus / Program / main21.c
blob4d169c7742d3c969431f513b7e70fba4faa6a13f
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 "dopus.h"
33 void fixdrivegadgets()
35 int i,b,l,len,ty;
37 if (!scrdata_drive_width || !scr_gadget_rows) return;
38 SetFont(main_rp,scr_font[FONT_GADGETS]);
40 ty=scrdata_gadget_ypos+scr_font[FONT_GADGETS]->tf_Baseline+
41 ((scrdata_gadget_height-2-scr_font[FONT_GADGETS]->tf_YSize)/2);
43 for (i=0;i<scr_gadget_rows;i++) {
44 b=i+data_drive_offset;
45 SetAPen(main_rp,screen_pens[config->drive[b].bpen].pen);
46 rectfill(main_rp,
47 scrdata_gadget_offset+2,
48 (i*scrdata_gadget_height)+scrdata_gadget_ypos,
49 scrdata_drive_width-4,
50 scrdata_gadget_height-2);
51 SetAPen(main_rp,screen_pens[config->drive[b].fpen].pen);
52 SetBPen(main_rp,screen_pens[config->drive[b].bpen].pen);
53 if (config->drive[b].name && config->drive[b].name[0]) {
54 len=0;
55 l=dotextlength(main_rp,config->drive[b].name,&len,scrdata_drive_width-4);
56 Move(main_rp,scrdata_gadget_offset+((scrdata_drive_width-l)/2),(i*scrdata_gadget_height)+ty);
57 Text(main_rp,config->drive[b].name,len);
59 drive_gadgets[i].Flags=
60 (config->drive[b].name && config->drive[b].name[0] &&
61 config->drive[b].function && config->drive[b].function[0])?
62 ((drive_unsel_border)?GFLG_GADGHIMAGE:GFLG_GADGHCOMP):GFLG_GADGHNONE;
64 SetFont(main_rp,scr_font[FONT_GENERAL]);
67 void nextdrives()
69 int old,a,b;
71 if (scrdata_drive_width && scr_gadget_rows) {
72 old=data_drive_offset;
73 FOREVER {
74 if (data_drive_offset%scr_gadget_rows)
75 data_drive_offset+=scr_gadget_rows-(data_drive_offset%scr_gadget_rows);
76 else data_drive_offset+=scr_gadget_rows;
77 if (data_drive_offset>=USEDRIVECOUNT || data_drive_offset<0)
78 data_drive_offset=0;
79 a=data_drive_offset+scr_gadget_rows;
80 for (b=data_drive_offset;b<a;b++)
81 if (config->drive[b].name[0] && config->drive[b].function &&
82 config->drive[b].function[0]) break;
83 if (b<a || data_drive_offset==old) break;
85 if (config->generalscreenflags&SCR_GENERAL_GADSLIDERS) {
86 FixSliderPot(Window,&drive_propgad,data_drive_offset,
87 USEDRIVECOUNT,scr_gadget_rows,!status_iconified);
89 if (!status_iconified) fixdrivegadgets();
93 void setupgadgets()
95 int a;
97 AddGList(Window,&path_strgadget[0],-1,2,NULL);
98 AddGList(Window,&vert_propgad[0],-1,2,NULL);
99 AddGList(Window,&horiz_propgad[0],-1,2,NULL);
100 AddGList(Window,screen_gadgets,-1,(config->generalscreenflags&SCR_GENERAL_TINYGADS)?24:18,NULL);
101 if (status_publicscreen) AddGList(Window,size_gadgets,-1,2,NULL);
102 RefreshGList(&path_strgadget[0],Window,NULL,2);
103 for (a=0;a<2;a++) {
104 ShowSlider(Window,&vert_propgad[a]);
105 ShowSlider(Window,&horiz_propgad[a]);
107 if (config->generalscreenflags&SCR_GENERAL_GADSLIDERS && scr_gadget_rows) {
108 if (scrdata_drive_width>0) {
109 AddGadgets(Window,
110 &drive_propgad,
111 NULL,
113 screen_pens[config->gadgettopcol].pen,
114 screen_pens[config->gadgetbotcol].pen,1);
116 if (scr_gadget_bank_count>1) {
117 AddGadgets(Window,
118 &gadget_propgad,
119 NULL,
121 screen_pens[config->gadgettopcol].pen,
122 screen_pens[config->gadgetbotcol].pen,1);
127 void allocate_borders()
129 int a,b;
131 LFreeRemember(&border_key);
133 CreateGadgetBorders(&border_key,
134 scrdata_gadget_width,scrdata_gadget_height,
135 &gadget_sel_border,&gadget_unsel_border,
137 screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
139 if (config->generalscreenflags&SCR_GENERAL_INDICATERMB)
140 CreateGadgetBorders(&border_key,
141 scrdata_gadget_width,scrdata_gadget_height,
142 &gadget_dog_sel_border,&gadget_dog_unsel_border,
144 screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
146 if (scrdata_drive_width && scr_gadget_rows) {
147 CreateGadgetBorders(&border_key,
148 scrdata_drive_width,scrdata_gadget_height,
149 &drive_sel_border,&drive_unsel_border,
151 screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
153 if ((drive_bank_sel_border=
154 LAllocRemember(&border_key,sizeof(struct Border)*2*scr_gadget_rows,0)) &&
155 (drive_bank_unsel_border=
156 LAllocRemember(&border_key,sizeof(struct Border)*2*scr_gadget_rows,0))) {
157 for (a=0;a<scr_gadget_rows;a++) {
158 b=a*2;
159 CopyMem((char *)drive_sel_border,(char *)&drive_bank_sel_border[b],
160 sizeof(struct Border)*2);
161 CopyMem((char *)drive_unsel_border,(char *)&drive_bank_unsel_border[b],
162 sizeof(struct Border)*2);
163 drive_bank_sel_border[b].NextBorder=&drive_bank_sel_border[b+1];
164 drive_bank_sel_border[b+1].NextBorder=(a<scr_gadget_rows-1)?
165 &drive_bank_sel_border[b+2]:NULL;
166 drive_bank_unsel_border[b].NextBorder=&drive_bank_unsel_border[b+1];
167 drive_bank_unsel_border[b+1].NextBorder=(a<scr_gadget_rows-1)?
168 &drive_bank_unsel_border[b+2]:NULL;
169 drive_bank_sel_border[b].TopEdge=a*scrdata_gadget_height;
170 drive_bank_sel_border[b+1].TopEdge=a*scrdata_gadget_height;
171 drive_bank_unsel_border[b].TopEdge=a*scrdata_gadget_height;
172 drive_bank_unsel_border[b+1].TopEdge=a*scrdata_gadget_height;
176 else {
177 drive_sel_border=NULL;
178 drive_unsel_border=NULL;
179 drive_bank_sel_border=NULL;
180 drive_bank_unsel_border=NULL;
183 AddGadgetBorders(&border_key,
184 &screen_gadgets[SCRGAD_TINYBUFFERLIST],2,
185 screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
187 AddGadgetBorders(&border_key,
188 &screen_gadgets[SCRGAD_TINYSELECT],2,
189 screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
191 if (config->generalscreenflags&SCR_GENERAL_TINYGADS)
192 AddGadgetBorders(&border_key,
193 &screen_gadgets[SCRGAD_TINYHELP],6,
194 screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
196 AddGadgetBorders(&border_key,
197 &screen_gadgets[SCRGAD_MOVELEFT1],4,
198 screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
200 AddGadgetBorders(&border_key,
201 &screen_gadgets[SCRGAD_MOVEUP1],4,
202 screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
204 AddGadgetBorders(&border_key,
205 &screen_gadgets[SCRGAD_BUFFERLEFT1],4,
206 screen_pens[config->gadgettopcol].pen,screen_pens[config->gadgetbotcol].pen);
209 void drawgadgets(addgads,bankoffset)
210 int addgads,bankoffset;
212 int x,y,yoff,a,b,len,l,ty,num,uspos,x1,y1;
213 char buf[256];
215 //D(bug("pageflip_data1 %lx, pageflip_data2 at %lx\n",pageflip_data1,pageflip_data2));
216 if (addgads) allocate_borders();
218 if (!scr_gadget_rows) return;
219 if (status_iconified>0) yoff=Window->BorderTop+1;
220 else {
221 yoff=scrdata_gadget_ypos;
222 SetFont(main_rp,scr_font[FONT_GADGETS]);
225 if (addgads!=-1) {
226 if (scrdata_drive_width) {
227 for (y=0;y<scr_gadget_rows;y++)
228 do3dbox(main_rp,
229 scrdata_gadget_offset+2,(y*scrdata_gadget_height)+yoff,
230 scrdata_drive_width-4,scrdata_gadget_height-2);
233 for (x=0;x<7;x++) {
234 for (y=0;y<scr_gadget_rows;y++) {
235 do3dbox(main_rp,
236 (x*scrdata_gadget_width)+scrdata_gadget_xpos+2,(y*scrdata_gadget_height)+yoff,
237 scrdata_gadget_width-4,scrdata_gadget_height-2);
242 if (status_iconified>0) ty=Window->BorderTop+main_rp->Font->tf_Baseline+1;
243 else ty=yoff+scr_font[FONT_GADGETS]->tf_Baseline+((scrdata_gadget_height-2-scr_font[FONT_GADGETS]->tf_YSize)/2);
245 num=0;
246 if (addgads!=-1) {
247 for (y=0;y<scr_gadget_rows;y++) {
248 a=((data_gadgetrow_offset+y)*7)+bankoffset;
249 for (x=0;x<7;x++,a++) {
250 main_gadgets[num].Flags=GFLG_GADGHNONE;
251 if (dopus_curgadbank) {
252 SetAPen(main_rp,screen_pens[dopus_curgadbank->gadgets[a].bpen].pen);
253 rectfill(main_rp,
254 (x1=((x*scrdata_gadget_width)+scrdata_gadget_xpos+2)),
255 (y1=((y*scrdata_gadget_height)+yoff)),
256 scrdata_gadget_width-4,
257 scrdata_gadget_height-2);
258 if (dopus_curgadbank->gadgets[a].name &&
259 dopus_curgadbank->gadgets[a].name[0]) {
260 SetAPen(main_rp,screen_pens[dopus_curgadbank->gadgets[a].fpen].pen);
261 SetBPen(main_rp,screen_pens[dopus_curgadbank->gadgets[a].bpen].pen);
262 len=makeusstring(dopus_curgadbank->gadgets[a].name,buf,&uspos);
263 l=dotextlength(main_rp,buf,&len,scrdata_gadget_width-4); buf[len]=0;
264 UScoreText(main_rp,buf,(x*scrdata_gadget_width)+scrdata_gadget_xpos+((scrdata_gadget_width-l)/2),(y*scrdata_gadget_height)+ty,uspos);
266 main_gadgets[num].Activation&=~GACT_BOOLEXTEND;
267 main_gadgets[num].SpecialInfo=NULL;
268 if (config->generalscreenflags&SCR_GENERAL_INDICATERMB &&
269 !bankoffset && isvalidgad(&dopus_curgadbank->gadgets[a+(GADCOUNT/2)])) {
270 drawgadgetcorner(main_rp,x1,y1);
271 fix_gadget_highlight(&dopus_curgadbank->gadgets[a],&main_gadgets[num],1);
273 else fix_gadget_highlight(&dopus_curgadbank->gadgets[a],&main_gadgets[num],0);
275 ++num;
280 if (addgads) {
281 num=0;
282 for (y=0;y<scr_gadget_rows;y++) {
283 b=((data_gadgetrow_offset+y)*7)+bankoffset;
284 for (x=0;x<7;x++,b++,num++) {
285 main_gadgets[num].Activation|=GACT_RELVERIFY;
286 main_gadgets[num].LeftEdge=(x*scrdata_gadget_width)+scrdata_gadget_xpos;
287 main_gadgets[num].TopEdge=(y*scrdata_gadget_height)+scrdata_gadget_ypos-1;
288 main_gadgets[num].Width=scrdata_gadget_width;
289 main_gadgets[num].Height=scrdata_gadget_height;
290 main_gadgets[num].GadgetType=GTYP_BOOLGADGET;
291 main_gadgets[num].GadgetID=MAIN_GAD_BASE+b;
292 main_gadgets[num].NextGadget=(b<41)?&main_gadgets[num+1]:NULL;
294 if (dopus_curgadbank) {
295 if (config->generalscreenflags&SCR_GENERAL_INDICATERMB &&
296 !bankoffset && isvalidgad(&dopus_curgadbank->gadgets[b+(GADCOUNT/2)])) {
297 fix_gadget_highlight(&dopus_curgadbank->gadgets[b],&main_gadgets[num],1);
299 else fix_gadget_highlight(&dopus_curgadbank->gadgets[b],&main_gadgets[num],0);
301 else main_gadgets[num].Flags=GFLG_GADGHNONE;
304 AddGList(Window,main_gadgets,-1,num,NULL);
305 if (scrdata_drive_width) {
306 for (y=0;y<scr_gadget_rows;y++) {
307 drive_gadgets[y].Flags=(config->drive[y+data_drive_offset].name[0] &&
308 config->drive[y+data_drive_offset].function &&
309 config->drive[y+data_drive_offset].function[0])?
310 ((drive_unsel_border)?GFLG_GADGHIMAGE:GFLG_GADGHCOMP):GFLG_GADGHNONE;
311 drive_gadgets[y].LeftEdge=scrdata_gadget_offset;
312 drive_gadgets[y].Width=scrdata_drive_width;
313 drive_gadgets[y].TopEdge=(y*scrdata_gadget_height)+scrdata_gadget_ypos-1;
314 drive_gadgets[y].Height=scrdata_gadget_height;
315 drive_gadgets[y].Activation=GACT_RELVERIFY;
316 drive_gadgets[y].GadgetType=GTYP_BOOLGADGET;
317 drive_gadgets[y].GadgetRender=drive_unsel_border;
318 drive_gadgets[y].SelectRender=drive_sel_border;
319 drive_gadgets[y].GadgetID=200+y;
320 drive_gadgets[y].NextGadget=(y<scr_gadget_rows-1)?&drive_gadgets[y+1]:NULL;
322 AddGList(Window,drive_gadgets,-1,scr_gadget_rows,NULL);
325 if (status_iconified<1) SetFont(main_rp,scr_font[FONT_GENERAL]);
328 void fix_gadget_highlight(func,gad,rmb)
329 struct newdopusfunction *func;
330 struct Gadget *gad;
331 int rmb;
333 struct Border *selborder,*unselborder;
335 if (rmb) {
336 selborder=gadget_dog_sel_border;
337 unselborder=gadget_dog_unsel_border;
339 else {
340 selborder=gadget_sel_border;
341 unselborder=gadget_unsel_border;
344 gad->GadgetRender=NULL;
345 gad->SelectRender=NULL;
347 if (isvalidgad(func)) {
348 if (unselborder) {
349 gad->Flags=GFLG_GADGHIMAGE;
350 gad->GadgetRender=unselborder;
351 gad->SelectRender=selborder;
353 else gad->Flags=GFLG_GADGHCOMP;
355 else gad->Flags=GFLG_GADGHNONE;
358 void init_menus()
360 int a;
362 for (a=0;a<5;a++) {
363 menu_menus[a].MenuName=config->menutit[a];
364 menu_menus[a].TopEdge=0;
365 menu_menus[a].Flags=MENUENABLED;
367 for (a=0;a<MENUCOUNT;a++) {
368 #ifdef __AROS__
369 menu_intuitext[a*2].DrawMode=JAM1;
370 #else
371 menu_intuitext[a*2].DrawMode=JAM2;
372 #endif
373 menu_intuitext[a*2].ITextFont=&menu_attr;
374 menu_intuitext[a*2].IText=(UBYTE *)menu_spaceitemnames[a/20];
375 menu_intuitext[a*2].NextText=&menu_intuitext[(a*2)+1];
376 #ifdef __AROS__
377 menu_intuitext[(a*2)+1].DrawMode=JAM1;
378 #else
379 menu_intuitext[(a*2)+1].DrawMode=JAM2;
380 #endif
381 menu_intuitext[(a*2)+1].ITextFont=&menu_attr;
382 menu_intuitext[(a*2)+1].IText=(UBYTE *)&menu_itemnames[a*MAXMENULENGTH];
383 menu_menuitem[a].Flags=ITEMTEXT|ITEMENABLED|HIGHCOMP;
384 menu_menuitem[a].ItemFill=(APTR)&menu_intuitext[a*2];
388 void layout_menus()
390 int a,b,c,d,e,w,f,x=0,l,rn=0,iwid[20],spacew,numspace,snum,barflag,t,top;
391 struct Menu *firstmenu=NULL,*lastmenu=NULL;
392 struct TextFont *title_font;
393 struct DrawInfo *drinfo=NULL;
394 struct Image *barimage;
395 UBYTE fpen,bpen,menu_fpen,menu_bpen;
396 char *name;
397 int spacewidth;
399 if (Window->MenuStrip) ClearMenuStrip(Window);
400 LFreeRemember(&menu_key);
402 title_font=Window->WScreen->RastPort.Font;
403 if (/*system_version2>=OSVER_39 &&*/ !MainScreen) drinfo=GetScreenDrawInfo(Window->WScreen);
405 spacew=gettextlength(scr_font[FONT_MENUS]," ",NULL,0);
407 // if (/*system_version2>=OSVER_39 &&*/ Window->Flags&WFLG_NEWLOOKMENUS) {
408 if (drinfo) {
409 menu_fpen=drinfo->dri_Pens[BARDETAILPEN];
410 menu_bpen=drinfo->dri_Pens[BARBLOCKPEN];
412 else {
413 menu_fpen=screen_pens[1].pen;
414 menu_bpen=screen_pens[2].pen;
416 // }
417 // else {
418 // menu_fpen=screen_pens[1].pen;
419 // menu_bpen=screen_pens[2].pen;
420 // }
422 for (a=0;a<MENUCOUNT;a++) {
423 // if (/*system_version2>=OSVER_39 &&*/
424 // Window->Flags&WFLG_NEWLOOKMENUS /*&&
425 // config->menu[a].fpen==0 && config->menu[a].bpen==1*/) {
426 // fpen=menu_fpen;
427 // bpen=menu_bpen;
428 // }
429 // else {
430 fpen=screen_pens[config->menu[a].fpen].pen;
431 bpen=screen_pens[config->menu[a].bpen].pen;
432 //D(bug("menu: %ld\tfpen: %ld,bpen: %ld\n",a,fpen,bpen));
433 // }
435 menu_intuitext[a*2].BackPen=(UBYTE)bpen;
436 menu_intuitext[(a*2)+1].FrontPen=(UBYTE)fpen;
437 menu_intuitext[(a*2)+1].BackPen=(UBYTE)bpen;
440 for (a=0;a<5;a++) {
441 c=0; d=a*20; l=0;
443 menu_menus[a].Width=
444 gettextlength(title_font,config->menutit[a],&l,0)+
445 title_font->tf_XSize;
446 menu_menus[a].LeftEdge=x;
448 for (b=19;b>=0;b--) {
449 if (config->menu[d+b].name && config->menu[d+b].name[0]) {
450 c=1;
451 break;
455 if (c) {
456 menu_real_number[rn++]=a;
457 x+=menu_menus[a].Width+(title_font->tf_XSize-1);
458 f=a*20;
459 w=menu_menus[a].Width;
460 for (e=0;e<20;e++) {
461 menu_menuitem[f].NextItem=NULL;
462 if (config->menu[f].name)
463 iwid[e]=gettextlength(scr_font[FONT_MENUS],config->menu[f].name,NULL,0);
464 else iwid[e]=0;
465 if (iwid[e]>w) w=iwid[e];
466 ++f;
469 f=a*20;
471 numspace=w/spacew;
472 CopyMem(str_space_string,menu_spaceitemnames[a],numspace);
473 menu_spaceitemnames[a][numspace]=0;
474 snum=(numspace>15)?15:numspace;
475 spacewidth=gettextlength(scr_font[FONT_MENUS],menu_spaceitemnames[a],NULL,0);
477 top=0;
478 barimage=NULL;
480 for (e=0;e<20;e++) {
482 menu_menuitem[f].TopEdge=top;
483 menu_menuitem[f].Width=w;
484 menu_menuitem[f].Height=scr_font[FONT_MENUS]->tf_YSize;
486 menu_menuitem[f].Flags=
487 ITEMTEXT|ITEMENABLED|((isvalidgad(&config->menu[f]))?HIGHCOMP:HIGHNONE);
489 menu_intuitext[f*2].LeftEdge=(menu_menuitem[f].LeftEdge+w)-spacewidth;
491 name=&menu_itemnames[f*MAXMENULENGTH];
492 barflag=0;
493 if (config->menu[f].name && config->menu[f].name[0]) {
494 LStrnCpy(name,config->menu[f].name,MAXMENULENGTH-1);
495 if (name[(t=(strlen(name)-1))]=='~') {
496 barflag=1;
497 name[t]=0;
500 else {
501 CopyMem(str_space_string,name,snum);
502 name[snum]=0;
504 top+=scr_font[FONT_MENUS]->tf_YSize;
505 if (barflag) {
506 top+=6;
507 menu_menuitem[f].MutualExclude=1;
508 if (!barimage) barimage=get_bar_image(menu_fpen,menu_bpen,w-1);
510 ++f;
512 menu_menus[a].Flags=MENUENABLED;
513 menu_menus[a].FirstItem=&menu_menuitem[d];
514 for (c=0,t=d;c<b;c++,t++)
515 get_bar_item(&menu_menuitem[t],&menu_menuitem[t+1],barimage);
516 menu_menuitem[t].MutualExclude=1;
517 get_bar_item(&menu_menuitem[t],NULL,NULL);
518 if (firstmenu) lastmenu->NextMenu=&menu_menus[a];
519 else firstmenu=&menu_menus[a];
520 lastmenu=&menu_menus[a];
521 lastmenu->NextMenu=NULL;
524 if (firstmenu)
526 /* do not enable - crash will happen
527 APTR vi;
529 if (GadToolsBase)
531 if (vi = GetVisualInfoA(Window->WScreen,NULL))
533 struct TextAttr ta = {scr_font[FONT_MENUS]->tf_Message.mn_Node.ln_Name,
534 scr_font[FONT_MENUS]->tf_YSize,
535 scr_font[FONT_MENUS]->tf_Style,
536 scr_font[FONT_MENUS]->tf_Flags};
537 LayoutMenus(firstmenu,vi,GTMN_TextAttr,&ta,TAG_END);
538 FreeVisualInfo(vi);
542 SetMenuStrip(Window,firstmenu);
544 if (drinfo) FreeScreenDrawInfo(Window->WScreen,drinfo);
547 int maxgadwidth(font,gads,num)
548 struct TextFont *font;
549 char **gads;
550 int num;
552 int a,mw=0,w,len;
554 for (a=0;a<num;a++) {
555 len=0;
556 if ((w=gettextlength(font,gads[a],&len,-1))>mw) mw=w;
558 return(mw);
561 int gettextlength(font,text,len,width)
562 struct TextFont *font;
563 char *text;
564 int *len,width;
566 struct RastPort testrast;
568 InitRastPort(&testrast);
569 if (font) SetFont(&testrast,font);
570 return(dotextlength(&testrast,text,len,width));
573 int dotextlength(r,text,len,width)
574 struct RastPort *r;
575 char *text;
576 int *len,width;
578 int l,x=0;
579 struct TextExtent ext;
581 if (!len || !(l=*len)) l=strlen(text);
582 if (l) {
583 if (/*system_version2 &&*/ width>0) {
584 // if (system_version2<OSVER_39 && r->Font->tf_Flags&FPF_PROPORTIONAL) ++width;
585 l=TextFit(r,text,l,&ext,NULL,1,width,r->Font->tf_YSize+1);
586 x=ext.te_Width;
588 else {
589 while ((x=TextLength(r,text,l))>width && width>0) {
590 if (!(--l)) break;
594 if (len) *len=l;
595 return(x);
598 void doposdriveprop()
600 int off,old;
602 if (scr_gadget_rows) {
603 ShowSlider(Window,&drive_propgad);
604 old=data_drive_offset;
605 off=GetSliderPos(&drive_propgad,USEDRIVECOUNT,scr_gadget_rows);
606 if (old!=off) {
607 data_drive_offset=off;
608 fixdrivegadgets();
613 int getgadbankcount(void)
615 struct dopusgadgetbanks *bank = dopus_firstgadbank;
616 int bankcount = 0;
618 for (;;bankcount++) {
619 if (!bank) break;
620 bank=bank->next;
622 return bankcount;
625 void doposgadgetprop(ref)
626 int ref;
628 if (scr_gadget_rows) {
629 struct dopusgadgetbanks *oldbank = dopus_curgadbank;
630 int a,
631 bankcount = getgadbankcount(),
632 bankstep,
633 oldoff = data_gadgetrow_offset,
634 num;
636 ShowSlider(Window,&gadget_propgad);
637 bankstep=6/scr_gadget_rows;
638 data_gadgetrow_offset=GetSliderPos(&gadget_propgad,(bankcount*6)/scr_gadget_rows,1);
639 a=data_gadgetrow_offset/bankstep;
640 data_gadgetrow_offset%=bankstep; data_gadgetrow_offset*=scr_gadget_rows;
641 dopus_curgadbank=dopus_firstgadbank; num=a;
642 while ((num--) && dopus_curgadbank->next) dopus_curgadbank=dopus_curgadbank->next;
643 if (dopus_curgadbank!=oldbank || data_gadgetrow_offset!=oldoff) drawgadgets(0,0);
644 if (ref) {
645 FixSliderPot(Window,
646 &gadget_propgad,
647 (a*bankstep)+(data_gadgetrow_offset/scr_gadget_rows),
648 (bankcount*6)/scr_gadget_rows,1,1);
653 void fixgadgetprop()
655 struct dopusgadgetbanks *bank;
656 int a,bankcount,num;
658 if (scr_gadget_rows &&
659 ((status_iconified && status_flags&STATUS_ISINBUTTONS) ||
660 (scr_gadget_bank_count>1 && config->generalscreenflags&SCR_GENERAL_GADSLIDERS))) {
661 bank=dopus_firstgadbank;
662 num=bankcount=0;
663 a=1;
664 while (bank) {
665 if (bank==dopus_curgadbank) a=0;
666 else if (a) ++num;
667 ++bankcount;
668 bank=bank->next;
670 if (!a) {
671 FixSliderPot(Window,
672 (status_iconified && status_flags&STATUS_ISINBUTTONS)?&iconbutpropgad:&gadget_propgad,
673 (num*(6/scr_gadget_rows))+(data_gadgetrow_offset/scr_gadget_rows),
674 (bankcount*6)/scr_gadget_rows,
675 1,1);
680 int makeusstring(from,to,uspos)
681 char *from,*to;
682 int *uspos;
684 int len,c;
686 *uspos=-1;
687 for (c=0,len=0;;c++) {
688 if (!from[c]) break;
689 else if (from[c]=='_' && *uspos==-1) *uspos=len;
690 else to[len++]=from[c];
692 to[len]=0;
693 return(len);
696 void drawgadgetcorner(r,x1,y1)
697 struct RastPort *r;
698 int x1,y1;
700 x1+=scrdata_gadget_width-2;
701 drawcornerimage(r,
702 x1,y1,
703 screen_pens[0].pen,
704 screen_pens[config->gadgetbotcol].pen,
705 screen_pens[config->gadgettopcol].pen);
708 void drawcornerimage(r,x1,y1,bg,bc,tc)
709 struct RastPort *r;
710 int x1,y1,bg,bc,tc;
712 SetAPen(r,bg);
713 rectfill(r,x1-5,y1-1,5,4);
714 SetDrMd(r,JAM1);
715 SetAPen(r,bc);
716 BltTemplate((char *)pageflip_data1,0,2,r,x1-6,y1-1,6,5);
717 SetAPen(r,tc);
718 BltTemplate((char *)pageflip_data2,0,2,r,x1-6,y1,6,3);
719 SetDrMd(r,JAM2);
722 void get_bar_item(item,nextitem,image)
723 struct MenuItem *item,*nextitem;
724 struct Image *image;
726 struct MenuItem *baritem;
728 if (item->MutualExclude==1 &&
729 (baritem=LAllocRemember(&menu_key,sizeof(struct MenuItem),MEMF_CLEAR))) {
731 if (nextitem) {
732 baritem->NextItem=nextitem;
733 baritem->TopEdge=item->TopEdge+item->Height+2;
734 baritem->Width=item->Width;
735 baritem->Height=2;
736 baritem->Flags=HIGHNONE;
737 baritem->ItemFill=image;
739 else {
740 baritem->TopEdge=item->TopEdge+item->Height;
741 baritem->Width=item->Width+1;
742 baritem->Height=0;
743 baritem->Flags=HIGHNONE;
745 item->NextItem=baritem;
747 else item->NextItem=nextitem;
748 item->MutualExclude=0;
751 struct Image *get_bar_image(fg,bg,width)
752 int fg,bg,width;
754 struct Image *image;
756 if (!(image=LAllocRemember(&menu_key,sizeof(struct Image),MEMF_CLEAR))) return(NULL);
758 image->Width=width;
759 image->Height=2;
760 image->PlaneOnOff=fg;
762 if (newlook) image->PlaneOnOff=fg;
763 else {
764 UWORD *imagedata;
765 int words,a,b,depth,pos;
767 words=(width+15)/16;
768 for (depth=0;;depth++)
769 if ((1<<depth)>fg && (1<<depth)>bg) break;
771 if (!(imagedata=LAllocRemember(&menu_key,words*2*depth*sizeof(UWORD),MEMF_CLEAR|MEMF_CHIP)))
772 return(NULL);
774 for (a=0,pos=0;a<depth;a++) {
775 for (b=0;b<words;b++,pos++) {
776 if (fg&(1<<a)) imagedata[pos]=0xdddd;
777 if (bg&(1<<a)) imagedata[pos]|=0x2222;
779 for (b=0;b<words;b++,pos++) {
780 if (fg&(1<<a)) imagedata[pos]=0x7777;
781 if (bg&(1<<a)) imagedata[pos]|=0x8888;
785 image->ImageData=imagedata;
786 image->Depth=depth;
787 image->PlanePick=(1<<depth)-1;
790 return(image);