Don't copy DirectoryOpus.CFG because that file works
[AROS-Contrib.git] / dopus / Library / requesters.c
blobec565da6ebcd25f3edfa6e64c0551b1fe1adc28f
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 /* Font-sensitive requester routines.
33 These routines are for LAYOUT ONLY!!!!
35 They do not add gadgets or listviews to a window, nor do they
36 attempt to process gadget or listview operations. They will
37 allocate most, if not all things you need to add an object
38 to the requester, however */
40 #include "dopuslib.h"
42 struct PrivateData {
43 struct Image *check_off_image;
44 struct Image *check_on_image;
45 struct Image *button_off_image;
46 struct Image *button_on_image;
49 const struct TextAttr
50 topazfont={(STRPTR)"topaz.font",8,0,0};
52 /* Open requester */
54 struct Window * __saveds R_OpenRequester(register struct RequesterBase *reqbase __asm("a0"))
56 struct NewWindow newwin;
57 struct Screen *screen,screendata;
58 struct Window *window=NULL,*center_window=NULL;
59 short width,height,attempt;
61 /* Forbid to prevent changes to Screen lists */
63 Forbid();
65 newwin.Type=0;
67 if (reqbase->rb_flags&RBF_WINDOWCENTER)
68 center_window=reqbase->rb_window;
69 reqbase->rb_window=NULL;
71 /* rb_screen overrides rb_screenname; if this is initialised then try
72 to open the window on the CUSTOMSCREEN given */
74 if (reqbase->rb_screen) {
75 newwin.Type=CUSTOMSCREEN;
76 newwin.Screen=reqbase->rb_screen;
77 screen=reqbase->rb_screen;
80 /* Otherwise, if rb_screenname is given, search screen lists for that
81 screen */
83 else if (reqbase->rb_screenname) {
85 /* Look for it as a public screen first (2.0 only) */
87 if (//IntuitionBase->LibNode.lib_Version>35 &&
88 (screen=LockPubScreen(reqbase->rb_screenname))) {
89 newwin.Type=PUBLICSCREEN;
90 newwin.Screen=screen;
93 /* Otherwise search screen lists manually */
95 else {
96 screen=IntuitionBase->FirstScreen;
97 while (screen) {
98 if (screen->Title &&
99 LStrCmpI((char *)screen->Title,reqbase->rb_screenname)==0) {
100 newwin.Type=CUSTOMSCREEN;
101 newwin.Screen=screen;
102 break;
104 screen=screen->NextScreen;
110 /* If the screen type is still unset, just open on the Workbench screen
111 (or default public screen) */
113 if (!newwin.Type) {
114 newwin.Type=WBENCHSCREEN;
115 GetWBScreen(&screendata);
116 screen=&screendata;
119 /* Check font pointer; if not set, use screen's font */
121 if (!reqbase->rb_font)
122 reqbase->rb_font=screen->RastPort.Font;
124 /* If font is proportional, use system default font */
126 if (reqbase->rb_font->tf_Flags&FPF_PROPORTIONAL)
127 reqbase->rb_font=GfxBase->DefaultFont;
129 /* Attempt this twice; first with the selected font, and if
130 the window is too large, again with topaz/8 */
132 for (attempt=0;attempt<2;attempt++) {
134 /* Setup window size for selected font */
136 width=(reqbase->rb_width*reqbase->rb_font->tf_XSize)+reqbase->rb_widthfine;
137 height=(reqbase->rb_height*reqbase->rb_font->tf_YSize)+reqbase->rb_heightfine;
139 if (reqbase->rb_flags&RBF_BORDERS) {
140 width+=screen->WBorLeft+screen->WBorRight;
141 height+=screen->WBorTop+screen->WBorBottom+screen->Font->ta_YSize+1;
144 /* If it's not going to fit on the screen, don't even attempt
145 to open it. Otherwise, fill in NewWindow structure */
147 if (width<=screen->Width && height<=screen->Height) {
149 if (reqbase->rb_flags&RBF_WINDOWCENTER && center_window) {
150 newwin.LeftEdge=center_window->LeftEdge+((center_window->Width-width)/2);
151 newwin.TopEdge=center_window->TopEdge+((center_window->Height-height)/2);
153 else {
154 newwin.LeftEdge=(screen->Width-width)/2;
155 newwin.TopEdge=(screen->Height-height)/2;
158 if (newwin.LeftEdge<0) newwin.LeftEdge=0;
159 else if (newwin.LeftEdge+width>screen->Width) newwin.LeftEdge=screen->Width-width;
160 if (newwin.TopEdge<0) newwin.TopEdge=0;
161 else if (newwin.TopEdge+height>screen->Height) newwin.TopEdge=screen->Height-height;
163 newwin.Width=width;
164 newwin.Height=height;
165 newwin.DetailPen=255;
166 newwin.BlockPen=255;
168 if (reqbase->rb_idcmpflags)
169 newwin.IDCMPFlags=reqbase->rb_idcmpflags;
170 else newwin.IDCMPFlags=
171 IDCMP_GADGETUP|
172 IDCMP_GADGETDOWN|
173 IDCMP_MOUSEBUTTONS|
174 IDCMP_MOUSEMOVE|
175 IDCMP_RAWKEY|
176 IDCMP_VANILLAKEY|
177 IDCMP_DISKREMOVED|
178 IDCMP_DISKINSERTED;
180 if (reqbase->rb_flags&RBF_BORDERS) {
181 newwin.Flags=
182 WFLG_DRAGBAR|
183 WFLG_DEPTHGADGET|
184 WFLG_RMBTRAP|
185 WFLG_ACTIVATE|
186 WFLG_NEWLOOKMENUS;
187 if (reqbase->rb_flags&RBF_CLOSEGAD) {
188 newwin.Flags|=WFLG_CLOSEGADGET;
189 newwin.IDCMPFlags|=IDCMP_CLOSEWINDOW;
192 else {
193 newwin.Flags=
194 WFLG_BORDERLESS|
195 WFLG_RMBTRAP|
196 WFLG_ACTIVATE|
197 WFLG_NEWLOOKMENUS;
200 newwin.FirstGadget=NULL;
201 newwin.CheckMark=NULL;
202 newwin.Title=reqbase->rb_title;
204 /* Try to open window; if we succeed, then render border and fill
205 in background */
207 if (window=OpenWindow(&newwin)) {
208 SetFont(window->RPort,reqbase->rb_font);
209 if (!(reqbase->rb_flags&RBF_BORDERS)) {
210 Do3DBox(window->RPort,2,1,window->Width-4,window->Height-2,
211 reqbase->rb_shine,reqbase->rb_shadow);
213 SetAPen(window->RPort,reqbase->rb_bg);
214 RectFill(window->RPort,
215 window->BorderLeft+2,
216 window->BorderTop+1,
217 window->Width-3-window->BorderRight,
218 window->Height-2-window->BorderBottom);
219 SetAPen(window->RPort,reqbase->rb_fg);
220 SetBPen(window->RPort,reqbase->rb_bg);
221 SetDrMd(window->RPort,JAM2);
222 break;
226 /* If we failed with the custom font, try again with topaz/8 */
228 if (attempt==0) {
229 if (!(reqbase->rb_font=OpenFont(&topazfont))) break;
230 reqbase->rb_privateflags|=RBP_CLOSEFONT;
234 /* Unlock the public screen we may have locked earlier */
236 if (screen && newwin.Type==PUBLICSCREEN) UnlockPubScreen(NULL,screen);
238 /* Fix StringExtend function for current font */
240 if (reqbase->rb_extend && window) reqbase->rb_extend->Font=reqbase->rb_font;
242 /* Restore multitasking */
244 Permit();
246 /* Initialise other data */
248 reqbase->rb_objects=NULL;
249 reqbase->rb_memory=NULL;
250 reqbase->rb_privatedata=
251 DoAllocRemember(&reqbase->rb_memory,sizeof(struct PrivateData),MEMF_CLEAR);
253 /* Fill out rb_window pointer in RequesterBase structure. We also
254 return the window pointer to indicate success or failure */
256 reqbase->rb_window=window;
258 return(window);
261 void __saveds R_CloseRequester(register struct RequesterBase *reqbase __asm("a0"))
263 if (reqbase->rb_window) {
264 CloseWindow(reqbase->rb_window);
265 reqbase->rb_window=NULL;
267 if (reqbase->rb_privateflags&RBP_CLOSEFONT && reqbase->rb_font)
268 CloseFont(reqbase->rb_font);
269 DoFreeRemember(&reqbase->rb_memory);
272 APTR __saveds R_AddRequesterObject(register struct RequesterBase *reqbase __asm("a0"),
273 register struct TagItem *taglist __asm("a1"))
275 struct RequesterObject *object=NULL,*tempobject;
276 struct PrivateData *private;
277 IPTR data;
278 int tag,size,type,xoffset,yoffset;
279 struct StringInfo *stringinfo=NULL;
280 struct PropInfo *propinfo;
281 struct Image *propimage;
282 struct Gadget *gadget=NULL;
283 char **string;
285 if (!taglist || !reqbase || !reqbase->rb_window) return(NULL);
287 private=(struct PrivateData *)reqbase->rb_privatedata;
289 if (reqbase->rb_flags&RBF_BORDERS) {
290 xoffset=reqbase->rb_window->BorderLeft;
291 yoffset=reqbase->rb_window->BorderTop;
293 else {
294 xoffset=0;
295 yoffset=0;
298 for (tag=0;tag>-1;tag++) {
299 data=taglist[tag].ti_Data;
300 switch (taglist[tag].ti_Tag) {
301 case TAG_END:
302 tag=-2;
303 break;
305 case TAG_SKIP:
306 break;
308 case TAG_MORE:
309 taglist=(struct TagItem *)data;
310 tag=-1;
311 break;
313 /* Object type */
315 case RO_Type:
316 if (object) break;
317 if (!(object=DoAllocRemember(&reqbase->rb_memory,
318 sizeof(struct RequesterObject),MEMF_CLEAR))) return(NULL);
319 switch (object->ro_type=data) {
320 case OBJECT_TEXT:
321 size=sizeof(Object_Text);
322 break;
323 case OBJECT_BORDER:
324 size=sizeof(Object_Border);
325 break;
326 case OBJECT_GADGET:
327 size=sizeof(Object_Gadget);
328 break;
329 case OBJECT_LISTVIEW:
330 size=sizeof(Object_ListView);
331 break;
333 if (!(object->ro_data=DoAllocRemember(&reqbase->rb_memory,
334 size,MEMF_CLEAR))) return(NULL);
336 switch (object->ro_type) {
337 case OBJECT_TEXT:
338 case OBJECT_BORDER:
339 ((Object_Text *)object->ro_data)->ot_left=
340 reqbase->rb_leftoffset+xoffset;
341 ((Object_Text *)object->ro_data)->ot_top=
342 reqbase->rb_topoffset+yoffset;
343 break;
344 case OBJECT_GADGET:
345 ((Object_Gadget *)object->ro_data)->og_gadget.LeftEdge=
346 reqbase->rb_leftoffset+xoffset;
347 ((Object_Gadget *)object->ro_data)->og_gadget.TopEdge=
348 reqbase->rb_topoffset+yoffset;
349 break;
350 case OBJECT_LISTVIEW:
351 ((Object_ListView *)object->ro_data)->ol_listview.x=
352 reqbase->rb_leftoffset+xoffset;
353 ((Object_ListView *)object->ro_data)->ol_listview.y=
354 reqbase->rb_topoffset+yoffset;
355 break;
358 if (tempobject=reqbase->rb_objects)
359 while (tempobject->ro_next) tempobject=tempobject->ro_next;
360 if (tempobject) tempobject->ro_next=object;
361 else reqbase->rb_objects=object;
362 break;
364 /* Gadget type (object->ro_Type==OBJECT_GADGET) */
366 case RO_GadgetType:
367 if (!object || object->ro_type!=OBJECT_GADGET) break;
368 gadget=&((Object_Gadget *)object->ro_data)->og_gadget;
369 ((Object_Gadget *)object->ro_data)->og_type=data;
370 switch (data) {
371 case GADGET_CYCLE:
372 gadget->MutualExclude=GAD_CYCLE;
374 case GADGET_TINYGLASS:
375 case GADGET_BOOLEAN:
376 type=GTYP_BOOLGADGET;
377 gadget->Flags=GFLG_GADGHCOMP;
378 gadget->Activation=GACT_RELVERIFY;
379 break;
381 case GADGET_INTEGER:
382 gadget->Activation|=GACT_LONGINT;
383 case GADGET_STRING:
384 type=GTYP_STRGADGET;
385 if (!(stringinfo=(struct StringInfo *)
386 DoAllocRemember(&reqbase->rb_memory,sizeof(struct StringInfo),MEMF_CLEAR)))
387 return(NULL);
388 gadget->SpecialInfo=(APTR)stringinfo;
389 gadget->Flags=GFLG_GADGHCOMP|GFLG_TABCYCLE;
390 if (reqbase->rb_extend) {
391 gadget->Flags|=GFLG_STRINGEXTEND;
392 stringinfo->Extension=reqbase->rb_extend;
394 gadget->Activation|=GACT_RELVERIFY|GACT_TOGGLESELECT;
395 break;
397 case GADGET_PROP:
398 type=GTYP_PROPGADGET;
399 if (!(propinfo=(struct PropInfo *)
400 DoAllocRemember(&reqbase->rb_memory,sizeof(struct PropInfo),MEMF_CLEAR)))
401 return(NULL);
402 gadget->SpecialInfo=(APTR)propinfo;
403 if (!(propimage=(struct Image *)
404 DoAllocRemember(&reqbase->rb_memory,sizeof(struct Image),MEMF_CLEAR)))
405 return(NULL);
406 gadget->GadgetRender=propimage;
407 break;
409 case GADGET_CHECK:
410 type=GTYP_BOOLGADGET;
411 gadget->Width=26;
412 gadget->Height=11;
413 gadget->Flags=GFLG_GADGIMAGE|GFLG_GADGHIMAGE;
414 gadget->Activation=GACT_RELVERIFY|GACT_TOGGLESELECT;
415 if (private) {
416 if (!private->check_off_image)
417 private->check_off_image=
418 DoGetCheckImage(reqbase->rb_shadow,reqbase->rb_bg,0,&reqbase->rb_memory);
419 if (!private->check_on_image)
420 private->check_on_image=
421 DoGetCheckImage(reqbase->rb_shadow,reqbase->rb_bg,1,&reqbase->rb_memory);
422 gadget->GadgetRender=(APTR)private->check_off_image;
423 gadget->SelectRender=(APTR)private->check_on_image;
425 gadget->MutualExclude=GAD_CHECK;
426 break;
428 case GADGET_RADIO:
429 type=GTYP_BOOLGADGET;
430 gadget->Width=15;
431 gadget->Height=7;
432 gadget->Flags=GFLG_GADGIMAGE|GFLG_GADGHIMAGE;
433 gadget->Activation=GACT_IMMEDIATE|GACT_TOGGLESELECT;
434 if (private) {
435 if (!private->button_off_image)
436 private->button_off_image=
437 DoGetButtonImage(15,9,reqbase->rb_shine,reqbase->rb_shadow,
438 reqbase->rb_bg,reqbase->rb_bg,&reqbase->rb_memory);
439 if (!private->button_on_image)
440 private->button_on_image=
441 DoGetButtonImage(15,9,reqbase->rb_shine,reqbase->rb_shadow,
442 reqbase->rb_fg,reqbase->rb_bg,&reqbase->rb_memory);
443 gadget->GadgetRender=(APTR)private->button_off_image;
444 gadget->SelectRender=(APTR)private->button_on_image;
446 gadget->MutualExclude=GAD_RADIO;
447 break;
449 gadget->GadgetType=type;
450 break;
452 /* Gadget ID (object->ro_type==OBJECT_GADGET) */
454 case RO_GadgetID:
455 if (!object || object->ro_type!=OBJECT_GADGET) break;
456 ((Object_Gadget *)object->ro_data)->og_gadget.GadgetID=data;
457 break;
459 /* Border type (object->ro_type==OBJECT_BORDER) */
461 case RO_BorderType:
462 if (!object || object->ro_type!=OBJECT_BORDER) break;
463 ((Object_Border *)object->ro_data)->ob_type=data;
464 break;
466 /* ListView ID (object->ro_type==OBJECT_LISTVIEW) */
468 case RO_ListViewID:
469 if (!object || object->ro_type!=OBJECT_LISTVIEW) break;
470 ((Object_ListView *)object->ro_data)->ol_listview.listid=data;
471 break;
473 /* Left edge positioning */
475 case RO_Left:
476 data*=reqbase->rb_font->tf_XSize;
477 case RO_LeftFine:
478 if (!object) break;
479 switch (object->ro_type) {
480 case OBJECT_TEXT:
481 case OBJECT_BORDER:
482 ((Object_Text *)object->ro_data)->ot_left+=data;
483 break;
485 case OBJECT_GADGET:
486 ((Object_Gadget *)object->ro_data)->og_gadget.LeftEdge+=data;
487 break;
489 case OBJECT_LISTVIEW:
490 ((Object_ListView *)object->ro_data)->ol_listview.x+=data;
491 break;
493 break;
495 /* Top edge positioning */
497 case RO_Top:
498 data*=reqbase->rb_font->tf_YSize;
499 case RO_TopFine:
500 if (!object) break;
501 switch (object->ro_type) {
502 case OBJECT_TEXT:
503 case OBJECT_BORDER:
504 ((Object_Text *)object->ro_data)->ot_top+=data;
505 break;
507 case OBJECT_GADGET:
508 ((Object_Gadget *)object->ro_data)->og_gadget.TopEdge+=data;
509 break;
511 case OBJECT_LISTVIEW:
512 ((Object_ListView *)object->ro_data)->ol_listview.y+=data;
513 break;
515 break;
517 /* Width adjustment */
519 case RO_Width:
520 data*=reqbase->rb_font->tf_XSize;
521 case RO_WidthFine:
522 if (!object) break;
523 switch (object->ro_type) {
524 case OBJECT_BORDER:
525 ((Object_Border *)object->ro_data)->ob_width+=data;
526 break;
528 case OBJECT_GADGET:
529 ((Object_Gadget *)object->ro_data)->og_gadget.Width+=data;
530 break;
532 case OBJECT_LISTVIEW:
533 ((Object_ListView *)object->ro_data)->ol_listview.w+=data;
534 break;
536 break;
538 /* Height adjustment */
540 case RO_Height:
541 data*=reqbase->rb_font->tf_YSize;
542 case RO_HeightFine:
543 if (!object) break;
544 switch (object->ro_type) {
545 case OBJECT_BORDER:
546 ((Object_Border *)object->ro_data)->ob_height+=data;
547 break;
549 case OBJECT_GADGET:
550 ((Object_Gadget *)object->ro_data)->og_gadget.Height+=data;
551 break;
553 case OBJECT_LISTVIEW:
554 ((Object_ListView *)object->ro_data)->ol_listview.h+=data;
555 break;
557 break;
559 /* Object text */
561 case RO_TextNum:
562 if (!reqbase->rb_flags&RBF_STRINGS || !reqbase->rb_string_table) break;
563 data=(IPTR)reqbase->rb_string_table[data];
565 case RO_Text:
566 if (!object || !data) break;
567 string=NULL;
568 switch (object->ro_type) {
569 case OBJECT_TEXT:
570 string=&((Object_Text *)object->ro_data)->ot_text;
571 break;
573 case OBJECT_GADGET:
574 string=&((Object_Gadget *)object->ro_data)->og_text;
575 break;
577 case OBJECT_BORDER:
578 string=&((Object_Border *)object->ro_data)->ob_text;
579 break;
581 case OBJECT_LISTVIEW:
582 string=&((Object_ListView *)object->ro_data)->ol_listview.title;
583 break;
585 if (string &&
586 (*string=DoAllocRemember(&reqbase->rb_memory,strlen((char *)data)+1,0)))
587 LStrCpy(*string,(char *)data);
588 break;
590 /* Text positioning */
592 case RO_TextPos:
593 if (!object) break;
594 switch (object->ro_type) {
595 case OBJECT_GADGET:
596 ((Object_Gadget *)object->ro_data)->og_textpos=data;
597 break;
599 case OBJECT_BORDER:
600 ((Object_Border *)object->ro_data)->ob_textpos=data;
601 break;
603 case OBJECT_LISTVIEW:
604 if (data==TEXTPOS_ABOVE)
605 ((Object_ListView *)object->ro_data)->ol_listview.flags|=DLVF_TTOP;
606 break;
608 break;
610 /* String gadget settings (gadgettype==GTYP_STRGADGET) */
612 case RO_StringBuf:
613 if (!stringinfo) break;
614 stringinfo->Buffer=(UBYTE *)data;
615 break;
617 case RO_StringLen:
618 if (!stringinfo) break;
619 stringinfo->MaxChars=data;
620 break;
622 case RO_StringUndo:
623 if (!stringinfo) break;
624 stringinfo->UndoBuffer=(UBYTE *)data;
625 break;
627 /* Boolean gadget setting */
629 case RO_BoolOn:
630 if (data && object && object->ro_type==OBJECT_GADGET)
631 ((Object_Gadget *)object->ro_data)->og_gadget.Flags|=GFLG_SELECTED;
632 break;
634 /* Various other tags */
636 case RO_ChkCenter:
637 if (data && object && object->ro_type==OBJECT_GADGET && gadget &&
638 (gadget->MutualExclude==GAD_CHECK || gadget->MutualExclude==GAD_RADIO) &&
639 reqbase->rb_font->tf_YSize>gadget->Height)
640 gadget->TopEdge+=(reqbase->rb_font->tf_YSize-gadget->Height)/2;
641 break;
643 case RO_HighRecess:
644 if (data && object) {
645 if (object->ro_type==OBJECT_GADGET &&
646 gadget && gadget->GadgetType==GTYP_BOOLGADGET) {
647 DoAddGadgetBorders(&reqbase->rb_memory,
648 gadget,1,
649 reqbase->rb_shine,reqbase->rb_shadow);
651 else if (object->ro_type==OBJECT_LISTVIEW)
652 ((Object_ListView *)object->ro_data)->ol_listview.flags|=DLVF_HIREC;
654 break;
658 if (stringinfo && !stringinfo->Buffer && stringinfo->MaxChars>0) {
659 if (!(stringinfo->Buffer=
660 DoAllocRemember(&reqbase->rb_memory,stringinfo->MaxChars+1,MEMF_CLEAR)))
661 return(NULL);
664 return((object)?object->ro_data:(APTR)NULL);
667 void __saveds R_RefreshRequesterObject(register struct RequesterBase *reqbase __asm("a0"),
668 register struct RequesterObject *object __asm("a1"))
670 UWORD count;
671 struct RastPort *rp;
673 if (!reqbase || !reqbase->rb_window) return;
674 if (object) count=1;
675 else if ((object=reqbase->rb_objects)) count=65535;
676 else return;
678 rp=reqbase->rb_window->RPort;
680 while (count-- && object) {
681 switch (object->ro_type) {
682 case OBJECT_TEXT:
683 R_ObjectText(reqbase,
684 ((Object_Text *)object->ro_data)->ot_left,
685 ((Object_Text *)object->ro_data)->ot_top,
686 -1,-1,
687 ((Object_Text *)object->ro_data)->ot_text,
688 TEXTPOS_ABSOLUTE);
689 break;
691 case OBJECT_BORDER:
692 switch (((Object_Border *)object->ro_data)->ob_type) {
693 case BORDER_NORMAL:
694 Do3DBox(rp,
695 ((Object_Border *)object->ro_data)->ob_left,
696 ((Object_Border *)object->ro_data)->ob_top,
697 ((Object_Border *)object->ro_data)->ob_width,
698 ((Object_Border *)object->ro_data)->ob_height,
699 reqbase->rb_shine,reqbase->rb_shadow);
700 break;
702 case BORDER_RECESSED:
703 Do3DBox(rp,
704 ((Object_Border *)object->ro_data)->ob_left,
705 ((Object_Border *)object->ro_data)->ob_top,
706 ((Object_Border *)object->ro_data)->ob_width,
707 ((Object_Border *)object->ro_data)->ob_height,
708 reqbase->rb_shadow,reqbase->rb_shine);
709 break;
711 case BORDER_GROUP:
712 DoDo3DFrame(rp,
713 ((Object_Border *)object->ro_data)->ob_left,
714 ((Object_Border *)object->ro_data)->ob_top,
715 ((Object_Border *)object->ro_data)->ob_width,
716 ((Object_Border *)object->ro_data)->ob_height,
717 ((Object_Border *)object->ro_data)->ob_text,
718 reqbase->rb_shine,reqbase->rb_shadow);
719 break;
721 case BORDER_STRING:
722 Do3DStringBox(rp,
723 ((Object_Border *)object->ro_data)->ob_left,
724 ((Object_Border *)object->ro_data)->ob_top,
725 ((Object_Border *)object->ro_data)->ob_width,
726 ((Object_Border *)object->ro_data)->ob_height,
727 reqbase->rb_shine,reqbase->rb_shadow);
728 break;
730 if (((Object_Border *)object->ro_data)->ob_type!=BORDER_GROUP &&
731 ((Object_Border *)object->ro_data)->ob_text) {
732 R_ObjectText(reqbase,
733 ((Object_Border *)object->ro_data)->ob_left,
734 ((Object_Border *)object->ro_data)->ob_top,
735 ((Object_Border *)object->ro_data)->ob_width,
736 ((Object_Border *)object->ro_data)->ob_height,
737 ((Object_Border *)object->ro_data)->ob_text,
738 ((Object_Border *)object->ro_data)->ob_textpos);
740 break;
742 case OBJECT_GADGET:
743 if (((Object_Gadget *)object->ro_data)->og_text) {
744 R_ObjectText(reqbase,
745 ((Object_Gadget *)object->ro_data)->og_gadget.LeftEdge,
746 ((Object_Gadget *)object->ro_data)->og_gadget.TopEdge,
747 ((Object_Gadget *)object->ro_data)->og_gadget.Width,
748 ((Object_Gadget *)object->ro_data)->og_gadget.Height,
749 ((Object_Gadget *)object->ro_data)->og_text,
750 ((Object_Gadget *)object->ro_data)->og_textpos);
752 if (((Object_Gadget *)object->ro_data)->og_type==GADGET_TINYGLASS) {
753 DoDoGlassImage(reqbase->rb_window->RPort,
754 &((Object_Gadget *)object->ro_data)->og_gadget,
755 reqbase->rb_shine,
756 reqbase->rb_shadow,
760 if (((Object_Gadget *)object->ro_data)->og_gadget.GadgetType==GTYP_STRGADGET &&
761 IntuitionBase->LibNode.lib_Version<36) {
762 SetAPen(reqbase->rb_window->RPort,0);
763 RectFill(reqbase->rb_window->RPort,
764 ((Object_Gadget *)object->ro_data)->og_gadget.LeftEdge,
765 ((Object_Gadget *)object->ro_data)->og_gadget.TopEdge,
766 ((Object_Gadget *)object->ro_data)->og_gadget.LeftEdge+
767 ((Object_Gadget *)object->ro_data)->og_gadget.Width-1,
768 ((Object_Gadget *)object->ro_data)->og_gadget.TopEdge+
769 ((Object_Gadget *)object->ro_data)->og_gadget.Height-1);
770 RefreshStrGad(&((Object_Gadget *)object->ro_data)->og_gadget,
771 reqbase->rb_window);
774 break;
776 object=object->ro_next;
780 void __saveds R_ObjectText(register struct RequesterBase *reqbase __asm("a0"),
781 register short left __asm("d0"),
782 register short top __asm("d1"),
783 register short width __asm("d2"),
784 register short height __asm("d3"),
785 register char *text __asm("a1"),
786 register unsigned short textpos __asm("d4"))
788 struct RastPort *rp;
789 short x,y,text_width,text_height,cx,cy,len,got_uscore=-1,uscoreok=1;
790 char *ptr,textbuf[82];
792 rp=reqbase->rb_window->RPort;
794 SetAPen(rp,reqbase->rb_fg);
795 SetBPen(rp,reqbase->rb_bg);
797 if (textpos&TEXTPOS_F_NOUSCORE) {
798 uscoreok=0;
799 textpos&=~TEXTPOS_F_NOUSCORE;
802 for (len=0,ptr=text;*ptr && len<80;len++,ptr++) {
803 if (uscoreok && *ptr=='_' && got_uscore==-1) {
804 got_uscore=len;
805 --len;
807 else textbuf[len]=*ptr;
809 textbuf[len]=0;
811 text_width=len*rp->Font->tf_XSize;
812 text_height=rp->Font->tf_YSize;
814 cx=left+((width-text_width)/2);
815 cy=top+((height-text_height)/2);
817 switch (textpos) {
818 case TEXTPOS_ABSOLUTE:
819 x=left;
820 y=top;
821 break;
823 case TEXTPOS_CENTER:
824 x=cx;
825 y=cy;
826 break;
828 case TEXTPOS_LEFT:
829 x=left-text_width-rp->Font->tf_XSize;
830 y=cy;
831 break;
833 case TEXTPOS_RIGHT:
834 x=left+width+rp->Font->tf_XSize;
835 y=cy;
836 break;
838 case TEXTPOS_ABOVE:
839 x=cx;
840 y=top-rp->Font->tf_YSize-2;
841 break;
843 case TEXTPOS_BELOW:
844 x=cx;
845 y=top+height+2;
846 break;
849 DoUScoreText(rp,textbuf,x,y+rp->Font->tf_Baseline,got_uscore);