home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Programming / DOpus4-GPL / Library / requesters.c < prev    next >
C/C++ Source or Header  |  2000-01-27  |  24KB  |  854 lines

  1. /*
  2.  
  3. Directory Opus 4
  4. Original GPL release version 4.12
  5. Copyright 1993-2000 Jonathan Potter
  6.  
  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.
  11.  
  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.
  16.  
  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.
  20.  
  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.
  25.  
  26. The release of Directory Opus 4 under the GPL in NO WAY affects
  27. the existing commercial status of Directory Opus 5.
  28.  
  29. */
  30.  
  31. /* Font-sensitive requester routines.
  32.  
  33.    These routines are for LAYOUT ONLY!!!!
  34.  
  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 */
  39.  
  40. #include "dopuslib.h"
  41. #include "requesters.h"
  42.  
  43. struct PrivateData {
  44.     struct Image *check_off_image;
  45.     struct Image *check_on_image;
  46.     struct Image *button_off_image;
  47.     struct Image *button_on_image;
  48. };
  49.  
  50. struct TextAttr
  51.     topazfont={(STRPTR)"topaz.font",8,0,0};
  52.  
  53. /* Open requester */
  54.  
  55. struct Window *__asm __saveds
  56. R_OpenRequester(register __a0 struct RequesterBase *reqbase)
  57. {
  58.     struct NewWindow newwin;
  59.     struct Screen *screen,screendata;
  60.     struct Window *window=NULL,*center_window=NULL;
  61.     short width,height,attempt;
  62.  
  63.     /* Forbid to prevent changes to Screen lists */
  64.  
  65.     Forbid();
  66.  
  67.     newwin.Type=0;
  68.  
  69.     if (reqbase->rb_flags&RBF_WINDOWCENTER)
  70.         center_window=reqbase->rb_window;
  71.     reqbase->rb_window=NULL;
  72.  
  73.     /* rb_screen overrides rb_screenname; if this is initialised then try
  74.        to open the window on the CUSTOMSCREEN given */
  75.  
  76.     if (reqbase->rb_screen) {
  77.         newwin.Type=CUSTOMSCREEN;
  78.         newwin.Screen=reqbase->rb_screen;
  79.         screen=reqbase->rb_screen;
  80.     }
  81.  
  82.     /* Otherwise, if rb_screenname is given, search screen lists for that
  83.        screen */
  84.  
  85.     else if (reqbase->rb_screenname) {
  86.  
  87.         /* Look for it as a public screen first (2.0 only) */
  88.  
  89.         if (IntuitionBase->LibNode.lib_Version>35 &&
  90.             (screen=LockPubScreen(reqbase->rb_screenname))) {
  91.             newwin.Type=PUBLICSCREEN;
  92.             newwin.Screen=screen;
  93.         }
  94.  
  95.         /* Otherwise search screen lists manually */
  96.  
  97.         else {
  98.             screen=IntuitionBase->FirstScreen;
  99.             while (screen) {
  100.                 if (screen->Title &&
  101.                     LStrCmpI((char *)screen->Title,reqbase->rb_screenname)==0) {
  102.                     newwin.Type=CUSTOMSCREEN;
  103.                     newwin.Screen=screen;
  104.                     break;
  105.                 }
  106.                 screen=screen->NextScreen;
  107.             }
  108.         }
  109.     }
  110.  
  111.     /* If the screen type is still unset, just open on the Workbench screen
  112.        (or default public screen) */
  113.  
  114.     if (!newwin.Type) {
  115.         newwin.Type=WBENCHSCREEN;
  116.         GetWBScreen(&screendata);
  117.         screen=&screendata;
  118.     }
  119.  
  120.     /* Check font pointer; if not set, use screen's font */
  121.  
  122.     if (!reqbase->rb_font)
  123.         reqbase->rb_font=screen->RastPort.Font;
  124.  
  125.     /* If font is proportional, use system default font */
  126.  
  127.     if (reqbase->rb_font->tf_Flags&FPF_PROPORTIONAL)
  128.         reqbase->rb_font=GfxBase->DefaultFont;
  129.  
  130.     /* Attempt this twice; first with the selected font, and if
  131.        the window is too large, again with topaz/8 */
  132.  
  133.     for (attempt=0;attempt<2;attempt++) {
  134.  
  135.         /* Setup window size for selected font */
  136.  
  137.         width=(reqbase->rb_width*reqbase->rb_font->tf_XSize)+reqbase->rb_widthfine;
  138.         height=(reqbase->rb_height*reqbase->rb_font->tf_YSize)+reqbase->rb_heightfine;
  139.  
  140.         if (reqbase->rb_flags&RBF_BORDERS) {
  141.             width+=screen->WBorLeft+screen->WBorRight;
  142.             height+=screen->WBorTop+screen->WBorBottom+screen->Font->ta_YSize+1;
  143.         }
  144.  
  145.         /* If it's not going to fit on the screen, don't even attempt
  146.            to open it. Otherwise, fill in NewWindow structure */
  147.  
  148.         if (width<=screen->Width && height<=screen->Height) {
  149.  
  150.             if (reqbase->rb_flags&RBF_WINDOWCENTER && center_window) {
  151.                 newwin.LeftEdge=center_window->LeftEdge+((center_window->Width-width)/2);
  152.                 newwin.TopEdge=center_window->TopEdge+((center_window->Height-height)/2);
  153.             }
  154.             else {
  155.                 newwin.LeftEdge=(screen->Width-width)/2;
  156.                 newwin.TopEdge=(screen->Height-height)/2;
  157.             }
  158.  
  159.             if (newwin.LeftEdge<0) newwin.LeftEdge=0;
  160.             else if (newwin.LeftEdge+width>screen->Width) newwin.LeftEdge=screen->Width-width;
  161.             if (newwin.TopEdge<0) newwin.TopEdge=0;
  162.             else if (newwin.TopEdge+height>screen->Height) newwin.TopEdge=screen->Height-height;
  163.  
  164.             newwin.Width=width;
  165.             newwin.Height=height;
  166.             newwin.DetailPen=255;
  167.             newwin.BlockPen=255;
  168.  
  169.             if (reqbase->rb_idcmpflags)
  170.                 newwin.IDCMPFlags=reqbase->rb_idcmpflags;
  171.             else newwin.IDCMPFlags=
  172.                 IDCMP_GADGETUP|
  173.                 IDCMP_GADGETDOWN|
  174.                 IDCMP_MOUSEBUTTONS|
  175.                 IDCMP_MOUSEMOVE|
  176.                 IDCMP_RAWKEY|
  177.                 IDCMP_VANILLAKEY|
  178.                 IDCMP_DISKREMOVED|
  179.                 IDCMP_DISKINSERTED;
  180.  
  181.             if (reqbase->rb_flags&RBF_BORDERS) {
  182.                 newwin.Flags=
  183.                     WFLG_DRAGBAR|
  184.                     WFLG_DEPTHGADGET|
  185.                     WFLG_RMBTRAP|
  186.                     WFLG_ACTIVATE|
  187.                     WFLG_NEWLOOKMENUS;
  188.                 if (reqbase->rb_flags&RBF_CLOSEGAD) {
  189.                     newwin.Flags|=WFLG_CLOSEGADGET;
  190.                     newwin.IDCMPFlags|=IDCMP_CLOSEWINDOW;
  191.                 }
  192.             }
  193.             else {
  194.                 newwin.Flags=
  195.                     WFLG_BORDERLESS|
  196.                     WFLG_RMBTRAP|
  197.                     WFLG_ACTIVATE|
  198.                     WFLG_NEWLOOKMENUS;
  199.             }
  200.  
  201.             newwin.FirstGadget=NULL;
  202.             newwin.CheckMark=NULL;
  203.             newwin.Title=reqbase->rb_title;
  204.  
  205.             /* Try to open window; if we succeed, then render border and fill
  206.                in background */
  207.  
  208.             if (window=OpenWindow(&newwin)) {
  209.                 SetFont(window->RPort,reqbase->rb_font);    
  210.                 if (!(reqbase->rb_flags&RBF_BORDERS)) {
  211.                     Do3DBox(window->RPort,2,1,window->Width-4,window->Height-2,
  212.                         reqbase->rb_shine,reqbase->rb_shadow);
  213.                 }
  214.                 SetAPen(window->RPort,reqbase->rb_bg);
  215.                 RectFill(window->RPort,
  216.                     window->BorderLeft+2,
  217.                     window->BorderTop+1,
  218.                     window->Width-3-window->BorderRight,
  219.                     window->Height-2-window->BorderBottom);
  220.                 SetAPen(window->RPort,reqbase->rb_fg);
  221.                 SetBPen(window->RPort,reqbase->rb_bg);
  222.                 SetDrMd(window->RPort,JAM2);
  223.                 break;
  224.             }
  225.         }
  226.  
  227.         /* If we failed with the custom font, try again with topaz/8 */
  228.  
  229.         if (attempt==0) {
  230.             if (!(reqbase->rb_font=OpenFont(&topazfont))) break;
  231.             reqbase->rb_privateflags|=RBP_CLOSEFONT;
  232.         }
  233.     }
  234.  
  235.     /* Unlock the public screen we may have locked earlier */
  236.  
  237.     if (screen && newwin.Type==PUBLICSCREEN) UnlockPubScreen(NULL,screen);
  238.  
  239.     /* Fix StringExtend function for current font */
  240.  
  241.     if (reqbase->rb_extend && window) reqbase->rb_extend->Font=reqbase->rb_font;
  242.         
  243.     /* Restore multitasking */
  244.  
  245.     Permit();
  246.  
  247.     /* Initialise other data */
  248.  
  249.     reqbase->rb_objects=NULL;
  250.     reqbase->rb_memory=NULL;
  251.     reqbase->rb_privatedata=
  252.         LAllocRemember(&reqbase->rb_memory,sizeof(struct PrivateData),MEMF_CLEAR);
  253.  
  254.     /* Fill out rb_window pointer in RequesterBase structure. We also
  255.        return the window pointer to indicate success or failure */
  256.  
  257.     reqbase->rb_window=window;
  258.  
  259.     return(window);
  260. }
  261.  
  262. void __asm __saveds
  263. R_CloseRequester(register __a0 struct RequesterBase *reqbase)
  264. {
  265.     if (reqbase->rb_window) {
  266.         CloseWindow(reqbase->rb_window);
  267.         reqbase->rb_window=NULL;
  268.     }
  269.     if (reqbase->rb_privateflags&RBP_CLOSEFONT && reqbase->rb_font)
  270.         CloseFont(reqbase->rb_font);
  271.     LFreeRemember(&reqbase->rb_memory);
  272. }
  273.  
  274. APTR __asm __saveds
  275. R_AddRequesterObject(register __a0 struct RequesterBase *reqbase,
  276.     register __a1 struct TagItem *taglist)
  277. {
  278.     struct RequesterObject *object=NULL,*tempobject;
  279.     struct PrivateData *private;
  280.     ULONG data;
  281.     int tag,size,type,xoffset,yoffset;
  282.     struct StringInfo *stringinfo=NULL;
  283.     struct PropInfo *propinfo;
  284.     struct Image *propimage;
  285.     struct Gadget *gadget=NULL;
  286.     char **string;
  287.  
  288.     if (!taglist || !reqbase || !reqbase->rb_window) return(NULL);
  289.  
  290.     private=(struct PrivateData *)reqbase->rb_privatedata;
  291.  
  292.     if (reqbase->rb_flags&RBF_BORDERS) {
  293.         xoffset=reqbase->rb_window->BorderLeft;
  294.         yoffset=reqbase->rb_window->BorderTop;
  295.     }
  296.     else {
  297.         xoffset=0;
  298.         yoffset=0;
  299.     }
  300.  
  301.     for (tag=0;tag>-1;tag++) {
  302.         data=taglist[tag].ti_Data;
  303.         switch (taglist[tag].ti_Tag) {
  304.             case TAG_END:
  305.                 tag=-2;
  306.                 break;
  307.  
  308.             case TAG_SKIP:
  309.                 break;
  310.  
  311.             case TAG_MORE:
  312.                 taglist=(struct TagItem *)data;
  313.                 tag=-1;
  314.                 break;
  315.  
  316.     /* Object type */
  317.  
  318.             case RO_Type:
  319.                 if (object) break;
  320.                 if (!(object=LAllocRemember(&reqbase->rb_memory,
  321.                     sizeof(struct RequesterObject),MEMF_CLEAR))) return(NULL);
  322.                 switch (object->ro_type=data) {
  323.                     case OBJECT_TEXT:
  324.                         size=sizeof(Object_Text);    
  325.                         break;
  326.                     case OBJECT_BORDER:
  327.                         size=sizeof(Object_Border);
  328.                         break;
  329.                     case OBJECT_GADGET:
  330.                         size=sizeof(Object_Gadget);
  331.                         break;
  332.                     case OBJECT_LISTVIEW:
  333.                         size=sizeof(Object_ListView);
  334.                         break;
  335.                 }
  336.                 if (!(object->ro_data=LAllocRemember(&reqbase->rb_memory,
  337.                     size,MEMF_CLEAR))) return(NULL);
  338.  
  339.                 switch (object->ro_type) {
  340.                     case OBJECT_TEXT:
  341.                     case OBJECT_BORDER:
  342.                         ((Object_Text *)object->ro_data)->ot_left=
  343.                             reqbase->rb_leftoffset+xoffset;
  344.                         ((Object_Text *)object->ro_data)->ot_top=
  345.                             reqbase->rb_topoffset+yoffset;
  346.                         break;
  347.                     case OBJECT_GADGET:
  348.                         ((Object_Gadget *)object->ro_data)->og_gadget.LeftEdge=
  349.                             reqbase->rb_leftoffset+xoffset;
  350.                         ((Object_Gadget *)object->ro_data)->og_gadget.TopEdge=
  351.                             reqbase->rb_topoffset+yoffset;
  352.                         break;
  353.                     case OBJECT_LISTVIEW:
  354.                         ((Object_ListView *)object->ro_data)->ol_listview.x=
  355.                             reqbase->rb_leftoffset+xoffset;
  356.                         ((Object_ListView *)object->ro_data)->ol_listview.y=
  357.                             reqbase->rb_topoffset+yoffset;
  358.                         break;
  359.                 }
  360.  
  361.                 if (tempobject=reqbase->rb_objects)
  362.                     while (tempobject->ro_next) tempobject=tempobject->ro_next;
  363.                 if (tempobject) tempobject->ro_next=object;
  364.                 else reqbase->rb_objects=object;
  365.                 break;
  366.  
  367.     /* Gadget type (object->ro_Type==OBJECT_GADGET) */
  368.  
  369.             case RO_GadgetType:
  370.                 if (!object || object->ro_type!=OBJECT_GADGET) break;
  371.                 gadget=&((Object_Gadget *)object->ro_data)->og_gadget;
  372.                 ((Object_Gadget *)object->ro_data)->og_type=data;
  373.                 switch (data) {
  374.                     case GADGET_CYCLE:
  375.                         gadget->MutualExclude=GAD_CYCLE;
  376.  
  377.                     case GADGET_TINYGLASS:
  378.                     case GADGET_BOOLEAN:
  379.                         type=GTYP_BOOLGADGET;
  380.                         gadget->Flags=GFLG_GADGHCOMP;
  381.                         gadget->Activation=GACT_RELVERIFY;
  382.                         break;
  383.  
  384.                     case GADGET_INTEGER:
  385.                         gadget->Activation|=GACT_LONGINT;
  386.                     case GADGET_STRING:
  387.                         type=GTYP_STRGADGET;
  388.                         if (!(stringinfo=(struct StringInfo *)
  389.                             LAllocRemember(&reqbase->rb_memory,sizeof(struct StringInfo),MEMF_CLEAR)))
  390.                             return(NULL);
  391.                         gadget->SpecialInfo=(APTR)stringinfo;
  392.                         gadget->Flags=GFLG_GADGHCOMP|GFLG_TABCYCLE;
  393.                         if (reqbase->rb_extend) {
  394.                             gadget->Flags|=GFLG_STRINGEXTEND;
  395.                             stringinfo->Extension=reqbase->rb_extend;
  396.                         }
  397.                         gadget->Activation|=GACT_RELVERIFY|GACT_TOGGLESELECT;
  398.                         break;
  399.  
  400.                     case GADGET_PROP:
  401.                         type=GTYP_PROPGADGET;
  402.                         if (!(propinfo=(struct PropInfo *)
  403.                             LAllocRemember(&reqbase->rb_memory,sizeof(struct PropInfo),MEMF_CLEAR)))
  404.                             return(NULL);
  405.                         gadget->SpecialInfo=(APTR)propinfo;
  406.                         if (!(propimage=(struct Image *)
  407.                             LAllocRemember(&reqbase->rb_memory,sizeof(struct Image),MEMF_CLEAR)))
  408.                             return(NULL);
  409.                         gadget->GadgetRender=propimage;
  410.                         break;
  411.  
  412.                     case GADGET_CHECK:
  413.                         type=GTYP_BOOLGADGET;
  414.                         gadget->Width=26;
  415.                         gadget->Height=11;
  416.                         gadget->Flags=GFLG_GADGIMAGE|GFLG_GADGHIMAGE;
  417.                         gadget->Activation=GACT_RELVERIFY|GACT_TOGGLESELECT;
  418.                         if (private) {
  419.                             if (!private->check_off_image)
  420.                                 private->check_off_image=
  421.                                     GetCheckImage(reqbase->rb_shadow,reqbase->rb_bg,0,&reqbase->rb_memory);
  422.                             if (!private->check_on_image)
  423.                                 private->check_on_image=
  424.                                     GetCheckImage(reqbase->rb_shadow,reqbase->rb_bg,1,&reqbase->rb_memory);
  425.                             gadget->GadgetRender=(APTR)private->check_off_image;
  426.                             gadget->SelectRender=(APTR)private->check_on_image;
  427.                         }
  428.                         gadget->MutualExclude=GAD_CHECK;
  429.                         break;
  430.  
  431.                     case GADGET_RADIO:
  432.                         type=GTYP_BOOLGADGET;
  433.                         gadget->Width=15;
  434.                         gadget->Height=7;
  435.                         gadget->Flags=GFLG_GADGIMAGE|GFLG_GADGHIMAGE;
  436.                         gadget->Activation=GACT_IMMEDIATE|GACT_TOGGLESELECT;
  437.                         if (private) {
  438.                             if (!private->button_off_image)
  439.                                 private->button_off_image=
  440.                                     GetButtonImage(15,9,reqbase->rb_shine,reqbase->rb_shadow,
  441.                                         reqbase->rb_bg,reqbase->rb_bg,&reqbase->rb_memory);
  442.                             if (!private->button_on_image)
  443.                                 private->button_on_image=
  444.                                     GetButtonImage(15,9,reqbase->rb_shine,reqbase->rb_shadow,
  445.                                         reqbase->rb_fg,reqbase->rb_bg,&reqbase->rb_memory);
  446.                             gadget->GadgetRender=(APTR)private->button_off_image;
  447.                             gadget->SelectRender=(APTR)private->button_on_image;
  448.                         }
  449.                         gadget->MutualExclude=GAD_RADIO;
  450.                         break;
  451.                 }
  452.                 gadget->GadgetType=type;
  453.                 break;
  454.  
  455.     /* Gadget ID (object->ro_type==OBJECT_GADGET) */
  456.  
  457.             case RO_GadgetID:
  458.                 if (!object || object->ro_type!=OBJECT_GADGET) break;
  459.                 ((Object_Gadget *)object->ro_data)->og_gadget.GadgetID=data;
  460.                 break;
  461.  
  462.     /* Border type (object->ro_type==OBJECT_BORDER) */
  463.  
  464.             case RO_BorderType:
  465.                 if (!object || object->ro_type!=OBJECT_BORDER) break;
  466.                 ((Object_Border *)object->ro_data)->ob_type=data;
  467.                 break;
  468.  
  469.     /* ListView ID (object->ro_type==OBJECT_LISTVIEW) */
  470.  
  471.             case RO_ListViewID:
  472.                 if (!object || object->ro_type!=OBJECT_LISTVIEW) break;
  473.                 ((Object_ListView *)object->ro_data)->ol_listview.listid=data;
  474.                 break;
  475.  
  476.     /* Left edge positioning */
  477.  
  478.             case RO_Left:
  479.                 data*=reqbase->rb_font->tf_XSize;
  480.             case RO_LeftFine:
  481.                 if (!object) break;
  482.                 switch (object->ro_type) {
  483.                     case OBJECT_TEXT:
  484.                     case OBJECT_BORDER:
  485.                         ((Object_Text *)object->ro_data)->ot_left+=data;
  486.                         break;
  487.  
  488.                     case OBJECT_GADGET:
  489.                         ((Object_Gadget *)object->ro_data)->og_gadget.LeftEdge+=data;
  490.                         break;
  491.  
  492.                     case OBJECT_LISTVIEW:
  493.                         ((Object_ListView *)object->ro_data)->ol_listview.x+=data;
  494.                         break;
  495.                 }
  496.                 break;
  497.  
  498.     /* Top edge positioning */
  499.  
  500.             case RO_Top:
  501.                 data*=reqbase->rb_font->tf_YSize;
  502.             case RO_TopFine:
  503.                 if (!object) break;
  504.                 switch (object->ro_type) {
  505.                     case OBJECT_TEXT:
  506.                     case OBJECT_BORDER:
  507.                         ((Object_Text *)object->ro_data)->ot_top+=data;
  508.                         break;
  509.  
  510.                     case OBJECT_GADGET:
  511.                         ((Object_Gadget *)object->ro_data)->og_gadget.TopEdge+=data;
  512.                         break;
  513.  
  514.                     case OBJECT_LISTVIEW:
  515.                         ((Object_ListView *)object->ro_data)->ol_listview.y+=data;
  516.                         break;
  517.                 }
  518.                 break;
  519.  
  520.     /* Width adjustment */
  521.  
  522.             case RO_Width:
  523.                 data*=reqbase->rb_font->tf_XSize;
  524.             case RO_WidthFine:
  525.                 if (!object) break;
  526.                 switch (object->ro_type) {
  527.                     case OBJECT_BORDER:
  528.                         ((Object_Border *)object->ro_data)->ob_width+=data;
  529.                         break;
  530.  
  531.                     case OBJECT_GADGET:
  532.                         ((Object_Gadget *)object->ro_data)->og_gadget.Width+=data;
  533.                         break;
  534.  
  535.                     case OBJECT_LISTVIEW:
  536.                         ((Object_ListView *)object->ro_data)->ol_listview.w+=data;
  537.                         break;
  538.                 }
  539.                 break;
  540.  
  541.     /* Height adjustment */
  542.  
  543.             case RO_Height:
  544.                 data*=reqbase->rb_font->tf_YSize;
  545.             case RO_HeightFine:
  546.                 if (!object) break;
  547.                 switch (object->ro_type) {
  548.                     case OBJECT_BORDER:
  549.                         ((Object_Border *)object->ro_data)->ob_height+=data;
  550.                         break;
  551.  
  552.                     case OBJECT_GADGET:
  553.                         ((Object_Gadget *)object->ro_data)->og_gadget.Height+=data;
  554.                         break;
  555.  
  556.                     case OBJECT_LISTVIEW:
  557.                         ((Object_ListView *)object->ro_data)->ol_listview.h+=data;
  558.                         break;
  559.                 }
  560.                 break;
  561.  
  562.     /* Object text */
  563.  
  564.             case RO_TextNum:
  565.                 if (!reqbase->rb_flags&RBF_STRINGS || !reqbase->rb_string_table) break;
  566.                 data=(ULONG)reqbase->rb_string_table[data];
  567.  
  568.             case RO_Text:
  569.                 if (!object || !data) break;
  570.                 string=NULL;
  571.                 switch (object->ro_type) {
  572.                     case OBJECT_TEXT:
  573.                         string=&((Object_Text *)object->ro_data)->ot_text;
  574.                         break;
  575.  
  576.                     case OBJECT_GADGET:
  577.                         string=&((Object_Gadget *)object->ro_data)->og_text;
  578.                         break;
  579.  
  580.                     case OBJECT_BORDER:
  581.                         string=&((Object_Border *)object->ro_data)->ob_text;
  582.                         break;
  583.  
  584.                     case OBJECT_LISTVIEW:
  585.                         string=&((Object_ListView *)object->ro_data)->ol_listview.title;
  586.                         break;
  587.                 }
  588.                 if (string &&
  589.                     (*string=LAllocRemember(&reqbase->rb_memory,strlen((char *)data)+1,0)))
  590.                     strcpy(*string,(char *)data);
  591.                 break;
  592.  
  593.     /* Text positioning */
  594.  
  595.             case RO_TextPos:
  596.                 if (!object) break;
  597.                 switch (object->ro_type) {
  598.                     case OBJECT_GADGET:
  599.                         ((Object_Gadget *)object->ro_data)->og_textpos=data;
  600.                         break;
  601.  
  602.                     case OBJECT_BORDER:
  603.                         ((Object_Border *)object->ro_data)->ob_textpos=data;
  604.                         break;
  605.  
  606.                     case OBJECT_LISTVIEW:
  607.                         if (data==TEXTPOS_ABOVE)
  608.                             ((Object_ListView *)object->ro_data)->ol_listview.flags|=DLVF_TTOP;
  609.                         break;
  610.                 }
  611.                 break;
  612.  
  613.     /* String gadget settings (gadgettype==GTYP_STRGADGET) */
  614.  
  615.             case RO_StringBuf:
  616.                 if (!stringinfo) break;
  617.                 stringinfo->Buffer=(UBYTE *)data;
  618.                 break;
  619.  
  620.             case RO_StringLen:
  621.                 if (!stringinfo) break;
  622.                 stringinfo->MaxChars=data;
  623.                 break;
  624.  
  625.             case RO_StringUndo:
  626.                 if (!stringinfo) break;
  627.                 stringinfo->UndoBuffer=(UBYTE *)data;
  628.                 break;
  629.  
  630.     /* Boolean gadget setting */
  631.  
  632.             case RO_BoolOn:
  633.                 if (data && object && object->ro_type==OBJECT_GADGET)
  634.                     ((Object_Gadget *)object->ro_data)->og_gadget.Flags|=GFLG_SELECTED;
  635.                 break;
  636.  
  637.     /* Various other tags */
  638.  
  639.             case RO_ChkCenter:
  640.                 if (data && object && object->ro_type==OBJECT_GADGET && gadget &&
  641.                     (gadget->MutualExclude==GAD_CHECK || gadget->MutualExclude==GAD_RADIO) &&
  642.                     reqbase->rb_font->tf_YSize>gadget->Height)
  643.                     gadget->TopEdge+=(reqbase->rb_font->tf_YSize-gadget->Height)/2;
  644.                 break;
  645.  
  646.             case RO_HighRecess:
  647.                 if (data && object) {
  648.                     if (object->ro_type==OBJECT_GADGET &&
  649.                         gadget && gadget->GadgetType==GTYP_BOOLGADGET) {
  650.                         DoAddGadgetBorders(&reqbase->rb_memory,
  651.                             gadget,1,
  652.                             reqbase->rb_shine,reqbase->rb_shadow);
  653.                     }
  654.                     else if (object->ro_type==OBJECT_LISTVIEW)
  655.                         ((Object_ListView *)object->ro_data)->ol_listview.flags|=DLVF_HIREC;
  656.                 }
  657.                 break;
  658.         }
  659.     }
  660.  
  661.     if (stringinfo && !stringinfo->Buffer && stringinfo->MaxChars>0) {
  662.         if (!(stringinfo->Buffer=
  663.             LAllocRemember(&reqbase->rb_memory,stringinfo->MaxChars+1,MEMF_CLEAR)))
  664.             return(NULL);
  665.     }
  666.  
  667.     return((object)?object->ro_data:(APTR)NULL);
  668. }
  669.  
  670. void __asm __saveds
  671. R_RefreshRequesterObject(register __a0 struct RequesterBase *reqbase,
  672.     register __a1 struct RequesterObject *object)
  673. {
  674.     USHORT count;
  675.     struct RastPort *rp;
  676.  
  677.     if (!reqbase || !reqbase->rb_window) return;
  678.     if (object) count=1;
  679.     else if ((object=reqbase->rb_objects)) count=65535;
  680.     else return;
  681.  
  682.     rp=reqbase->rb_window->RPort;
  683.  
  684.     while (count-- && object) {
  685.         switch (object->ro_type) {
  686.             case OBJECT_TEXT:
  687.                 R_ObjectText(reqbase,
  688.                     ((Object_Text *)object->ro_data)->ot_left,
  689.                     ((Object_Text *)object->ro_data)->ot_top,
  690.                     -1,-1,
  691.                     ((Object_Text *)object->ro_data)->ot_text,
  692.                     TEXTPOS_ABSOLUTE);
  693.                 break;
  694.  
  695.             case OBJECT_BORDER:
  696.                 switch (((Object_Border *)object->ro_data)->ob_type) {
  697.                     case BORDER_NORMAL:
  698.                         Do3DBox(rp,
  699.                             ((Object_Border *)object->ro_data)->ob_left,
  700.                             ((Object_Border *)object->ro_data)->ob_top,
  701.                             ((Object_Border *)object->ro_data)->ob_width,
  702.                             ((Object_Border *)object->ro_data)->ob_height,
  703.                             reqbase->rb_shine,reqbase->rb_shadow);
  704.                         break;
  705.  
  706.                     case BORDER_RECESSED:
  707.                         Do3DBox(rp,
  708.                             ((Object_Border *)object->ro_data)->ob_left,
  709.                             ((Object_Border *)object->ro_data)->ob_top,
  710.                             ((Object_Border *)object->ro_data)->ob_width,
  711.                             ((Object_Border *)object->ro_data)->ob_height,
  712.                             reqbase->rb_shadow,reqbase->rb_shine);
  713.                         break;
  714.  
  715.                     case BORDER_GROUP:
  716.                         DoDo3DFrame(rp,
  717.                             ((Object_Border *)object->ro_data)->ob_left,
  718.                             ((Object_Border *)object->ro_data)->ob_top,
  719.                             ((Object_Border *)object->ro_data)->ob_width,
  720.                             ((Object_Border *)object->ro_data)->ob_height,
  721.                             ((Object_Border *)object->ro_data)->ob_text,
  722.                             reqbase->rb_shine,reqbase->rb_shadow);
  723.                         break;
  724.  
  725.                     case BORDER_STRING:
  726.                         Do3DStringBox(rp,
  727.                             ((Object_Border *)object->ro_data)->ob_left,
  728.                             ((Object_Border *)object->ro_data)->ob_top,
  729.                             ((Object_Border *)object->ro_data)->ob_width,
  730.                             ((Object_Border *)object->ro_data)->ob_height,
  731.                             reqbase->rb_shine,reqbase->rb_shadow);
  732.                         break;
  733.                 }
  734.                 if (((Object_Border *)object->ro_data)->ob_type!=BORDER_GROUP &&
  735.                     ((Object_Border *)object->ro_data)->ob_text) {
  736.                     R_ObjectText(reqbase,
  737.                         ((Object_Border *)object->ro_data)->ob_left,
  738.                         ((Object_Border *)object->ro_data)->ob_top,
  739.                         ((Object_Border *)object->ro_data)->ob_width,
  740.                         ((Object_Border *)object->ro_data)->ob_height,
  741.                         ((Object_Border *)object->ro_data)->ob_text,
  742.                         ((Object_Border *)object->ro_data)->ob_textpos);
  743.                 }
  744.                 break;
  745.  
  746.             case OBJECT_GADGET:
  747.                 if (((Object_Gadget *)object->ro_data)->og_text) {
  748.                     R_ObjectText(reqbase,
  749.                         ((Object_Gadget *)object->ro_data)->og_gadget.LeftEdge,
  750.                         ((Object_Gadget *)object->ro_data)->og_gadget.TopEdge,
  751.                         ((Object_Gadget *)object->ro_data)->og_gadget.Width,
  752.                         ((Object_Gadget *)object->ro_data)->og_gadget.Height,
  753.                         ((Object_Gadget *)object->ro_data)->og_text,
  754.                         ((Object_Gadget *)object->ro_data)->og_textpos);
  755.                 }
  756.                 if (((Object_Gadget *)object->ro_data)->og_type==GADGET_TINYGLASS) {
  757.                     DoDoGlassImage(reqbase->rb_window->RPort,
  758.                         &((Object_Gadget *)object->ro_data)->og_gadget,
  759.                         reqbase->rb_shine,
  760.                         reqbase->rb_shadow,
  761.                         0);
  762.                 }
  763.                 if (((Object_Gadget *)object->ro_data)->og_gadget.GadgetType==GTYP_STRGADGET &&
  764.                     IntuitionBase->LibNode.lib_Version<36) {
  765.                     SetAPen(reqbase->rb_window->RPort,0);
  766.                     RectFill(reqbase->rb_window->RPort,
  767.                         ((Object_Gadget *)object->ro_data)->og_gadget.LeftEdge,
  768.                         ((Object_Gadget *)object->ro_data)->og_gadget.TopEdge,
  769.                         ((Object_Gadget *)object->ro_data)->og_gadget.LeftEdge+
  770.                             ((Object_Gadget *)object->ro_data)->og_gadget.Width-1,
  771.                         ((Object_Gadget *)object->ro_data)->og_gadget.TopEdge+
  772.                             ((Object_Gadget *)object->ro_data)->og_gadget.Height-1);
  773.                     RefreshStrGad(&((Object_Gadget *)object->ro_data)->og_gadget,
  774.                         reqbase->rb_window);
  775.                 }
  776.                 break;
  777.         }
  778.         object=object->ro_next;
  779.     }
  780. }
  781.  
  782. void __stdargs __saveds
  783. R_ObjectText(struct RequesterBase *reqbase,
  784.     short left,
  785.     short top,
  786.     short width,
  787.     short height,
  788.     char *text,
  789.     unsigned short textpos)
  790. {
  791.     struct RastPort *rp;
  792.     short x,y,text_width,text_height,cx,cy,len,got_uscore=-1,uscoreok=1;
  793.     char *ptr,textbuf[82];
  794.  
  795.     rp=reqbase->rb_window->RPort;
  796.  
  797.     SetAPen(rp,reqbase->rb_fg);
  798.     SetBPen(rp,reqbase->rb_bg);
  799.  
  800.     if (textpos&TEXTPOS_F_NOUSCORE) {
  801.         uscoreok=0;
  802.         textpos&=~TEXTPOS_F_NOUSCORE;
  803.     }
  804.  
  805.     for (len=0,ptr=text;*ptr && len<80;len++,ptr++) {
  806.         if (uscoreok && *ptr=='_' && got_uscore==-1) {
  807.             got_uscore=len;
  808.             --len;
  809.         }
  810.         else textbuf[len]=*ptr;
  811.     }
  812.     textbuf[len]=0;
  813.  
  814.     text_width=len*rp->Font->tf_XSize;
  815.     text_height=rp->Font->tf_YSize;
  816.  
  817.     cx=left+((width-text_width)/2);
  818.     cy=top+((height-text_height)/2);
  819.  
  820.     switch (textpos) {
  821.         case TEXTPOS_ABSOLUTE:
  822.             x=left;
  823.             y=top;
  824.             break;
  825.  
  826.         case TEXTPOS_CENTER:
  827.             x=cx;
  828.             y=cy;
  829.             break;
  830.  
  831.         case TEXTPOS_LEFT:
  832.             x=left-text_width-rp->Font->tf_XSize;
  833.             y=cy;
  834.             break;
  835.  
  836.         case TEXTPOS_RIGHT:
  837.             x=left+width+rp->Font->tf_XSize;
  838.             y=cy;
  839.             break;
  840.  
  841.         case TEXTPOS_ABOVE:
  842.             x=cx;
  843.             y=top-rp->Font->tf_YSize-2;
  844.             break;
  845.  
  846.         case TEXTPOS_BELOW:
  847.             x=cx;
  848.             y=top+height+2;
  849.             break;
  850.     }
  851.  
  852.     UScoreText(rp,textbuf,x,y+rp->Font->tf_Baseline,got_uscore);
  853. }
  854.