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.
33 void fixdrivegadgets()
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
);
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]) {
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
]);
71 if (scrdata_drive_width
&& scr_gadget_rows
) {
72 old
=data_drive_offset
;
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)
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();
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);
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) {
113 screen_pens
[config
->gadgettopcol
].pen
,
114 screen_pens
[config
->gadgetbotcol
].pen
,1);
116 if (scr_gadget_bank_count
>1) {
121 screen_pens
[config
->gadgettopcol
].pen
,
122 screen_pens
[config
->gadgetbotcol
].pen
,1);
127 void allocate_borders()
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
++) {
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
;
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
;
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;
221 yoff
=scrdata_gadget_ypos
;
222 SetFont(main_rp
,scr_font
[FONT_GADGETS
]);
226 if (scrdata_drive_width
) {
227 for (y
=0;y
<scr_gadget_rows
;y
++)
229 scrdata_gadget_offset
+2,(y
*scrdata_gadget_height
)+yoff
,
230 scrdata_drive_width
-4,scrdata_gadget_height
-2);
234 for (y
=0;y
<scr_gadget_rows
;y
++) {
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);
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
);
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);
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
;
333 struct Border
*selborder
,*unselborder
;
336 selborder
=gadget_dog_sel_border
;
337 unselborder
=gadget_dog_unsel_border
;
340 selborder
=gadget_sel_border
;
341 unselborder
=gadget_unsel_border
;
344 gad
->GadgetRender
=NULL
;
345 gad
->SelectRender
=NULL
;
347 if (isvalidgad(func
)) {
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
;
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
++) {
369 menu_intuitext
[a
*2].DrawMode
=JAM1
;
371 menu_intuitext
[a
*2].DrawMode
=JAM2
;
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];
377 menu_intuitext
[(a
*2)+1].DrawMode
=JAM1
;
379 menu_intuitext
[(a
*2)+1].DrawMode
=JAM2
;
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];
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
;
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) {
409 menu_fpen
=drinfo
->dri_Pens
[BARDETAILPEN
];
410 menu_bpen
=drinfo
->dri_Pens
[BARBLOCKPEN
];
413 menu_fpen
=screen_pens
[1].pen
;
414 menu_bpen
=screen_pens
[2].pen
;
418 // menu_fpen=screen_pens[1].pen;
419 // menu_bpen=screen_pens[2].pen;
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*/) {
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));
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
;
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]) {
456 menu_real_number
[rn
++]=a
;
457 x
+=menu_menus
[a
].Width
+(title_font
->tf_XSize
-1);
459 w
=menu_menus
[a
].Width
;
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);
465 if (iwid
[e
]>w
) w
=iwid
[e
];
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);
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
];
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))]=='~') {
501 CopyMem(str_space_string
,name
,snum
);
504 top
+=scr_font
[FONT_MENUS
]->tf_YSize
;
507 menu_menuitem
[f
].MutualExclude
=1;
508 if (!barimage
) barimage
=get_bar_image(menu_fpen
,menu_bpen
,w
-1);
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
;
526 /* do not enable - crash will happen
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);
542 SetMenuStrip(Window
,firstmenu
);
544 if (drinfo
) FreeScreenDrawInfo(Window
->WScreen
,drinfo
);
547 int maxgadwidth(font
,gads
,num
)
548 struct TextFont
*font
;
554 for (a
=0;a
<num
;a
++) {
556 if ((w
=gettextlength(font
,gads
[a
],&len
,-1))>mw
) mw
=w
;
561 int gettextlength(font
,text
,len
,width
)
562 struct TextFont
*font
;
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
)
579 struct TextExtent ext
;
581 if (!len
|| !(l
=*len
)) l
=strlen(text
);
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);
589 while ((x
=TextLength(r
,text
,l
))>width
&& width
>0) {
598 void doposdriveprop()
602 if (scr_gadget_rows
) {
603 ShowSlider(Window
,&drive_propgad
);
604 old
=data_drive_offset
;
605 off
=GetSliderPos(&drive_propgad
,USEDRIVECOUNT
,scr_gadget_rows
);
607 data_drive_offset
=off
;
613 int getgadbankcount(void)
615 struct dopusgadgetbanks
*bank
= dopus_firstgadbank
;
618 for (;;bankcount
++) {
625 void doposgadgetprop(ref
)
628 if (scr_gadget_rows
) {
629 struct dopusgadgetbanks
*oldbank
= dopus_curgadbank
;
631 bankcount
= getgadbankcount(),
633 oldoff
= data_gadgetrow_offset
,
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);
647 (a
*bankstep
)+(data_gadgetrow_offset
/scr_gadget_rows
),
648 (bankcount
*6)/scr_gadget_rows
,1,1);
655 struct dopusgadgetbanks
*bank
;
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
;
665 if (bank
==dopus_curgadbank
) a
=0;
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
,
680 int makeusstring(from
,to
,uspos
)
687 for (c
=0,len
=0;;c
++) {
689 else if (from
[c
]=='_' && *uspos
==-1) *uspos
=len
;
690 else to
[len
++]=from
[c
];
696 void drawgadgetcorner(r
,x1
,y1
)
700 x1
+=scrdata_gadget_width
-2;
704 screen_pens
[config
->gadgetbotcol
].pen
,
705 screen_pens
[config
->gadgettopcol
].pen
);
708 void drawcornerimage(r
,x1
,y1
,bg
,bc
,tc
)
713 rectfill(r
,x1
-5,y1
-1,5,4);
716 BltTemplate((char *)pageflip_data1
,0,2,r
,x1
-6,y1
-1,6,5);
718 BltTemplate((char *)pageflip_data2
,0,2,r
,x1
-6,y1
,6,3);
722 void get_bar_item(item
,nextitem
,image
)
723 struct MenuItem
*item
,*nextitem
;
726 struct MenuItem
*baritem
;
728 if (item
->MutualExclude
==1 &&
729 (baritem
=LAllocRemember(&menu_key
,sizeof(struct MenuItem
),MEMF_CLEAR
))) {
732 baritem
->NextItem
=nextitem
;
733 baritem
->TopEdge
=item
->TopEdge
+item
->Height
+2;
734 baritem
->Width
=item
->Width
;
736 baritem
->Flags
=HIGHNONE
;
737 baritem
->ItemFill
=image
;
740 baritem
->TopEdge
=item
->TopEdge
+item
->Height
;
741 baritem
->Width
=item
->Width
+1;
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
)
756 if (!(image
=LAllocRemember(&menu_key
,sizeof(struct Image
),MEMF_CLEAR
))) return(NULL
);
760 image
->PlaneOnOff
=fg
;
762 if (newlook) image->PlaneOnOff=fg;
765 int words,a,b,depth,pos;
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)))
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;
787 image->PlanePick=(1<<depth)-1;