
/*
$Id: mt_funcs.c,v 1.9 2001/01/14 14:50:03 carlos Exp $.
*/

#include "mt_includes.h"
#include "mt_private.h"

// v1


//#define HighliteLabel(num)         TextObject, MUIA_Weight, 1, MUIA_Text_Contents, GS(num), MUIA_Text_PreParse, "\0333", End
//#define HighliteLabelKey(num, key) TextObject, MUIA_Weight, 1, MUIA_Text_Contents, GS(num), MUIA_Text_PreParse, "\0333", MUIA_Text_HiChar, (char)key[0], End
//#define LabelKey(num, key)         TextObject, MUIA_Weight, 1, MUIA_Text_PreParse, "\033r", MUIA_Text_Contents, GS(num), MUIA_Text_HiChar, (char)key[0], End

/// mt_Get
ULONG SAVEDS ASM mt_Get( REG(a0) Object *obj, REG(d0) ULONG attr )
{
ULONG tmp;

    get( obj, attr, &tmp );
    return( tmp );
}
//|

/// mt_ParseHotkey

char SAVEDS ASM mt_ParseHotkey( REG(a0) char *string )
{
char *Button;
char Key = '\0';

    if(string)
       {
       Button = strchr(string, '_');

       if(Button)
         Key = ToLower(Button[1]);

       }

    return(Key);
}
//|

/// mt_Label
Object * SAVEDS ASM mt_Label( REG(a0) char *str )
{
// Etykieta

      return(MUI_MakeObject(MUIO_Label    ,str, MUIO_Label_DoubleFrame));
}
//|
/// mt_PopButton

Object * SAVEDS ASM mt_PopButton( REG(d0) int img, REG(a0) char *key )
{
// PopButton z szortkatem

       Object *obj = MUI_MakeObject(MUIO_PopButton, img);

       if(obj)
           {
           set(obj, MUIA_CycleChain, TRUE);
           set(obj, MUIA_ControlChar, mt_ParseHotkey(key));
           }
       return(obj);
}
//|
/// mt_Checkmark

Object * SAVEDS ASM mt_Checkmark( REG(a0) char *str,
                                  REG(d0) ULONG val,
                                  REG(a1) char *help )
{
// Czekmark z szortkatem

        Object *obj = MUI_MakeObject(MUIO_Checkmark, str);
        if(obj)
           {
           set(obj, MUIA_Selected, val );
           set(obj, MUIA_CycleChain, TRUE);
           set(obj, MUIA_ShortHelp, help );
           }
        return(obj);
}
//|

/// mt_Cycle

Object * SAVEDS ASM mt_Cycle( REG(a0) char **array,
                              REG(a1) char *str,
                              REG(d0) ULONG val,
                              REG(a2) char *help )
{
// Sajkl z szortkatem

        Object *obj = MUI_MakeObject(MUIO_Cycle , str, array);
        if(obj)
           {
           set(obj, MUIA_Cycle_Active, val );
           set(obj, MUIA_CycleChain, TRUE);
           set(obj, MUIA_ShortHelp, help );
           }

        return(obj);
}
//|
/// mt_CycleWeight

Object * SAVEDS ASM mt_CycleWeight( REG(a0) char **array,
                                    REG(a1) char *str,
                                    REG(d0) ULONG value,
                                    REG(d1) long weight,
                                    REG(a2) char *help )
{
// Sajkl z szortkatem

        Object *obj = mt_Cycle(array, str, value, help);
        if(obj)
           {
           set(obj, MUIA_Weight, weight);
           }

        return(obj);
}
//|

/// mt_Slider

Object * SAVEDS ASM mt_Slider( REG(d0) int min,
                               REG(d1) int max,
                               REG(d2) int level,
                               REG(a0) char *str,
                               REG(a1) char *help )
{
Object *obj = SliderObject, SliderFrame, SliderBack,
                            MUIA_ControlChar, mt_ParseHotkey(str),
                            MUIA_Slider_Min, min,
                            MUIA_Slider_Max, max,
                            MUIA_CycleChain, TRUE,
                            MUIA_Slider_Level, level,
                            MUIA_ShortHelp, help,
                            End;

        return(obj);
}
//|
/// mt_SliderFmt

Object * SAVEDS ASM mt_SliderFmt( REG(d0) int min,
                                  REG(d1) int max,
                                  REG(d2) int level,
                                  REG(a0) char *str,
                                  REG(a1) char *fmt,
                                  REG(a2) char *help )
{
APTR obj = mt_Slider( min, max, level, str, help );

    if( obj )
       {
       set( obj, MUIA_Numeric_Format, fmt);
       }

    return( obj );
}

//|

/// mt_String

Object * SAVEDS ASM mt_String( REG(a0) char *str,
                               REG(d0) int maxlen,
                               REG(a1) char *label,
                               REG(a2) char *help )
{

Object *obj;

	obj = StringObject, StringFrame,
                            MUIA_ControlChar, mt_ParseHotkey( label ),
                            MUIA_String_MaxLen, maxlen,
                            MUIA_CycleChain, TRUE,
                            MUIA_String_AdvanceOnCR, TRUE,
                            End;

   if( str )
	 set( obj, MUIA_String_Contents, str );

   if( help )
     set( obj, MUIA_ShortHelp, help );

   return(obj);
}
//|
/// mt_StringSecret

Object * SAVEDS ASM mt_StringSecret( REG(a0) char *text,
                                     REG(d0) int maxlen,
                                     REG(a1) char *label,
                                     REG(a2) char *help )
{

    Object *obj = mt_String(text, maxlen, label, help );

    if( obj )
       set(obj, MUIA_String_Secret, TRUE);

    return(obj);

}
//|
/// mt_StringAccept
Object * SAVEDS ASM mt_StringAccept( REG(a0) char *text,
                                     REG(d0) int maxlen,
                                     REG(a1) char *label,
                                     REG(a2) char *accept,
                                     REG(a3) char *help
                                     )
{
    Object *obj = mt_String(text, maxlen, label, help );

    if( obj )
       set( obj, MUIA_String_Accept, accept );

    return(obj);

}
//|
/// mt_StringReject
Object * SAVEDS ASM mt_StringReject( REG(a0) char *text,
                                     REG(d0) int maxlen,
                                     REG(a1) char *label,
                                     REG(a2) char *reject,
                                     REG(a3) char *help )
{

    Object *obj = mt_String(text, maxlen, label, help );

    if( obj )
       set( obj, MUIA_String_Reject, reject );

    return(obj);

}
//|

/// mt_Button

Object * SAVEDS ASM mt_Button( REG(a0) char *str, REG(a1) char *help )
{
// buton textowy

    Object *obj = MUI_MakeObject( MUIO_Button, str );

    if(obj)
       {
       set( obj, MUIA_CycleChain, TRUE );
       if( help )
          set( obj, MUIA_ShortHelp , help );
       }

    return(obj);
}
//|
/// mt_ButtonWeight

Object * SAVEDS ASM mt_ButtonWeight( REG(a0) char *str,
                                     REG(d0) int weight,
                                     REG(a1) char *help )
{
// buton textowy z podanâ wagâ

        Object *obj = mt_Button( str, help );

        if(obj)
          {
          set(obj, MUIA_Weight    , weight);
          }
        return(obj);
}
//|
/// mt_ButtonToggle

Object * SAVEDS ASM mt_ButtonToggle( REG(a0) char *str,
                                     REG(a1) char *help )
{
// buton textowy typu toggle

    Object *obj = mt_Button( str, help );

    if( obj )
       {
       set(obj, MUIA_InputMode, MUIV_InputMode_Toggle);
       }


    return(obj);
}
//|

/// mt_WinOpen

ULONG SAVEDS ASM mt_WinOpen( REG(a0) Object *win )
{

    set( win, MUIA_Window_Open, TRUE );
    return( mt_Get( win, MUIA_Window_Open ) );

}
//|
/// mt_WinAttach

ULONG SAVEDS ASM mt_WinAttach( REG(a0) Object *app, REG(a1) Object *win )
{

    if( app && win )
                {
        DoMethod(app, OM_ADDMEMBER, win);
        return( TRUE );
                }
        return( FALSE );

}
//|
/// mt_WinDetach

void SAVEDS ASM mt_WinDetach( REG(a0) Object *app, REG(a1) Object *win )
{

    if( win && app )
       {
       DoMethod( app, OM_REMMEMBER, win );
       MUI_DisposeObject( win );
       }

}
//|

/// mt_Text

Object * SAVEDS ASM mt_Text( REG(a0) char *text, REG(a1) char *preparse )
{

    Object *obj = TextObject, TextFrame, TextBack,
                  MUIA_Text_Contents, text,
                  End;


    if( preparse && obj )
       set( obj, MUIA_Text_PreParse, preparse );



    return( obj );
}

//|

/// mt_Radio

Object * SAVEDS ASM mt_Radio( REG(a0) char *array, REG(a1) char *label, REG(a2) char *help )
{

    return( RadioObject,
                MUIA_Radio_Entries, array,
                MUIA_ControlChar, mt_ParseHotkey( label ),
                MUIA_CycleChain, TRUE,
                MUIA_ShortHelp, help,
                End
           );

}

//|
/// mt_Check

Object * SAVEDS ASM mt_Check( REG(a0) char *label,
                              REG(d0) ULONG aligment,
                              REG(d1) ULONG state,
                              REG(a1) char *help )

{
Object *obj;

    if( aligment == mt_Check_AlignRight )
       {
       obj = HGroup,
                   MUIA_ShortHelp, help,

                   Child, HVSpace,
                   Child, mt_Label( label ),
                   Child, ImageObject,
                               ImageButtonFrame,
                               MUIA_InputMode     , MUIV_InputMode_Toggle,
                               MUIA_Image_Spec    , MUII_CheckMark,
                               MUIA_Image_FreeVert, TRUE,
                               MUIA_Selected      , state,
                               MUIA_Background    , MUII_ButtonBack,
                               MUIA_ShowSelState  , FALSE,
                               MUIA_ControlChar   , mt_ParseHotkey( label ),
                               MUIA_CycleChain    , TRUE,
                               End,
                   End;
       }
    else
       {
       obj = HGroup,
                   MUIA_ShortHelp, help,

                   Child, ImageObject,
                               ImageButtonFrame,
                               MUIA_InputMode     , MUIV_InputMode_Toggle,
                               MUIA_Image_Spec    , MUII_CheckMark,
                               MUIA_Image_FreeVert, TRUE,
                               MUIA_Selected      , state,
                               MUIA_Background    , MUII_ButtonBack,
                               MUIA_ShowSelState  , FALSE,
                               MUIA_ControlChar   , mt_ParseHotkey( label ),
                               End,
                   Child, mt_Label( label ),
                   Child, HVSpace,
                   End;
       }


    return( obj );
}

//|

/// mt_GetStringA

/*
** Requester dot. wartoôci numerycznych
** Zwraca BOOL w zaleûnoôci czy uûytkownik
** wybraî OK czy nie. Wynik umieszczany
** jest w odpowiednim polu struktury StringRequest
** w zaleûnoôci od typu reqestera
*/


ULONG SAVEDS ASM mt_GetStringA( REG(a0) Object *app,
                                REG(a1) char   *buffer,
                                REG(d0) ULONG   buf_len,
                                REG(a2) struct TagItem *tagitem)

{
Object *Window      = NULL,     /* STRING REQUESTER */
        *GR_Group,
        *ST_String,
        *BT_Ok,
        *BT_Cancel;

#define MSG_STRREQ_WINTITLE "String request"
#define MSG_STRREQ_TITLE    "Enter string"
#define MSG_STRREQ_OK       "_Ok"
#define MSG_STRREQ_CANCEL   "_Cancel"

char *WindowTitle = MSG_STRREQ_WINTITLE;
char *GroupTitle  = MSG_STRREQ_TITLE;
char *Contents    = NULL;
char *Ok          = MSG_STRREQ_OK;
char *Cancel      = MSG_STRREQ_CANCEL;
char *Info        = FALSE;
char *StringHelp  = NULL;

ULONG Secret      = FALSE;
ULONG NoEmpty     = FALSE;

struct TagItem *tags, *tag;

char  result  = FALSE;


    if( !app )
       return( FALSE );


    for(tags=tagitem; tag = NextTagItem( &tags ); )
       {
       switch(tag->ti_Tag)
           {
           case mt_StrReq_WinTitle:
               WindowTitle = (char *)tag->ti_Data;
               break;

           case mt_StrReq_Contents:
               Contents = (char *)tag->ti_Data;
               break;

           case mt_StrReq_Ok:
               Ok = (char *)tag->ti_Data;
               break;

           case mt_StrReq_Cancel:
               Cancel = (char *)tag->ti_Data;
               break;

           case mt_StrReq_Secret:
               Secret = tag->ti_Data;
               break;

           case mt_StrReq_NoEmpty:
               NoEmpty = tag->ti_Data;
               break;

           case mt_StrReq_GroupTitle:
               GroupTitle = (char *)tag->ti_Data;
               break;

           case mt_StrReq_Info:
               Info = (char *)tag->ti_Data;
               break;

           case mt_StrReq_StringHelp:
               StringHelp = (char *)tag->ti_Data;
               break;

           }
       }


///   Create window

       Window = WindowObject,
                        MUIA_Window_ID         , ID_MT_STRREQ,
//                        MUIA_Window_ScreenTitle, ScreenTitle,
                        MUIA_Window_Title      , WindowTitle,
                        WindowContents,
                           VGroup,

                           Child, GR_Group = VGroup,
                                  GroupFrameT( GroupTitle ),
                                  Child, ST_String = mt_String( Contents, buf_len, NULL, StringHelp ),
                                  End,

                           Child, HGroup,
                                  MUIA_Group_SameSize, TRUE,
                                  Child, BT_Ok     = mt_Button( Ok, NULL ),
                                  Child, BT_Cancel = mt_Button( Cancel, NULL ),
                                  End,

                           End,
                      End;


       if( !Window )
           return( FALSE );


       if( Info )
           {
           Object *FT_Info = FloattextObject,
                               TextFrame, TextBack,
                               MUIA_Floattext_Text, Info,
                               End;

           if( FT_Info )
               {
               if (DoMethod( GR_Group, MUIM_Group_InitChange ))
                   {
                   DoMethod( GR_Group, OM_REMMEMBER, ST_String );

                   DoMethod( GR_Group, OM_ADDMEMBER, FT_Info );
                   DoMethod( GR_Group, OM_ADDMEMBER, ST_String );

                   DoMethod( GR_Group, MUIM_Group_ExitChange );
                   }
               }

           }
//|


    mt_Sleep( TRUE );


    // notification
    DoMethod(Window   , MUIM_Notify, MUIA_Window_CloseRequest, TRUE ,MUIV_Notify_Application, 2 ,MUIM_Application_ReturnID, ID_CANCEL);
    DoMethod(BT_Ok    , MUIM_Notify, MUIA_Pressed, FALSE, MUIV_Notify_Application, 2 ,MUIM_Application_ReturnID, ID_OK);
    DoMethod(BT_Cancel, MUIM_Notify, MUIA_Pressed, FALSE, MUIV_Notify_Application, 2 ,MUIM_Application_ReturnID, ID_CANCEL);


    // setting up...
    if( WindowTitle )
       set( Window, MUIA_Window_Title, WindowTitle );

    if( Contents )
        setstring( ST_String, Contents );

    set( Window, MUIA_Window_ActiveObject, ST_String );

/*
    if( NoEmpty )
       set( BT_Ok, MUIA_Disabled,  (*(char *)getstring( ST_String ) == 0 ) );
*/


    mt_WinAttach( app, Window );


    // let's go

    {
    char  running = TRUE;
    ULONG signal  = 0;


    if(  mt_WinOpen( Window ) )
       {
       while(running)
          {
          switch (DoMethod(app, MUIM_Application_Input, &signal))
            {
            case ID_OK:
               {
               char *buf = getstring( ST_String );

               if( NoEmpty && buf[0] == 0 )
                   {
                   DisplayBeep(0);
                   set( Window, MUIA_Window_ActiveObject, ST_String );
                   break;
                   }

               strncpy(buffer, buf, buf_len);
               result = TRUE;
               running = FALSE;
               }
               break;

            case ID_CANCEL:
               running = FALSE;
               break;

            }
          if(running && signal) Wait(signal);
          }

       mt_WinClose( Window );
       }
    else
       {
       DisplayBeep(0);
//       MUI_Request(app, MainWindow, 0, TITLE, MSG_OK, MSG_ERR_WINDOW);
       }
    }


    mt_WinDetach( app, Window );

    mt_Sleep( FALSE );

    return(result);


}
//|
/// mt_GetIntegerA

/*
** Requester dot. wartoôci numerycznych
** Zwraca BOOL w zaleûnoôci czy uûytkownik
** wybraî OK czy nie. Wynik umieszczany
** jest w odpowiednim polu struktury StringRequest
** w zaleûnoôci od typu reqestera
*/


ULONG SAVEDS ASM mt_GetIntegerA( REG(a0) Object *app,
                                 REG(a1) LONG   *value,
                                 REG(a2) struct TagItem *tagitem)

{
Object *Window      = NULL,     /* STRING REQUESTER */
       *GR_Group,
       *ST_String,
       *BT_Ok,
       *BT_Cancel,

       *GR_Bound = NULL;


#define MSG_INTREQ_WINTITLE "Integer request"
#define MSG_INTREQ_TITLE    "Enter value"
#define MSG_INTREQ_OK       "_Ok"
#define MSG_INTREQ_CANCEL   "_Cancel"

#define INTREQ_SIZE 30

char Contents[ INTREQ_SIZE ] = "";
char *WindowTitle = MSG_INTREQ_WINTITLE;
char *GroupTitle  = MSG_INTREQ_TITLE;
char *Ok          = MSG_INTREQ_OK;
char *Cancel      = MSG_INTREQ_CANCEL;
char *Info        = NULL;
char *StringHelp  = NULL;

char MinBound = FALSE;
char MaxBound = FALSE;
LONG MinVal, MaxVal;

struct TagItem *tags, *tag;

char  result  = FALSE;


    if( !app )
       return( FALSE );


    for(tags=tagitem; tag = NextTagItem( &tags ); )
       {
       switch(tag->ti_Tag)
           {
           case mt_IntReq_WinTitle:
               WindowTitle = (char *)tag->ti_Data;
               break;

           case mt_IntReq_Value:
               sprintf(Contents, "%ld", (LONG)tag->ti_Data );
               break;

           case mt_IntReq_Ok:
               Ok = (char *)tag->ti_Data;
               break;

           case mt_IntReq_Cancel:
               Cancel = (char *)tag->ti_Data;
               break;

           case mt_IntReq_GroupTitle:
               GroupTitle = (char *)tag->ti_Data;
               break;    

           case mt_IntReq_Min:
               MinVal   = (LONG)tag->ti_Data;
               MinBound = TRUE;
               break;

           case mt_IntReq_Max:
               MaxVal   = (LONG)tag->ti_Data;
               MaxBound = TRUE;
               break;

           case mt_IntReq_Info:
               Info = (char *)tag->ti_Data;
               break;

           case mt_IntReq_StringHelp:
               StringHelp = (char *)tag->ti_Data;
               break;
           }
       }


    // some anti-dummies checks...

    if( MinBound && MaxBound )
       if( MinVal > MaxVal )
           {
           LONG tmp = MinVal;

           MinVal = MaxVal;
           MaxVal = tmp;
           }


///   Create window
        Window = WindowObject,
                        MUIA_Window_ID         , ID_MT_INTREQ,
//                        MUIA_Window_ScreenTitle, ScreenTitle,
                        MUIA_Window_Title      , WindowTitle,
                        WindowContents,
                           VGroup,

                           Child, GR_Group = VGroup,
                                  GroupFrameT( GroupTitle ),
                                  Child, ST_String = mt_StringAccept( Contents, INTREQ_SIZE, NULL, "-0123456789", StringHelp ),
                                  End,

                           Child, HGroup,
                                  MUIA_Group_SameSize, TRUE,
                                  Child, BT_Ok     = mt_Button( Ok, NULL ),
                                  Child, BT_Cancel = mt_Button( Cancel, NULL ),
                                  End,

                           End,
                      End;

    if( !Window )
       return(FALSE);


    if( Info )
           {
           Object *FT_Info = FloattextObject,
                               TextFrame, TextBack,
                               MUIA_Floattext_Text, Info,
                               End;

           if( FT_Info )
               {
               if (DoMethod( GR_Group, MUIM_Group_InitChange ))
                   {
                   DoMethod( GR_Group, OM_REMMEMBER, ST_String );

                   DoMethod( GR_Group, OM_ADDMEMBER, FT_Info );
                   DoMethod( GR_Group, OM_ADDMEMBER, ST_String );

                   DoMethod( GR_Group, MUIM_Group_ExitChange );
                   }
               }

           }

//|

    // any bounds?

    if( MinBound || MaxBound )
       {
       GR_Bound = HGroup, MUIA_Group_SameSize, TRUE, End;

       if( GR_Bound )
           {
           char tmp[60];

           if( MinBound )
               {
               sprintf( tmp, "\033bMin:\033n %ld", MinVal );
               DoMethod( GR_Bound, OM_ADDMEMBER, mt_Text( tmp, "\033c" ) );
               }

           if( MaxBound )
               {
               sprintf( tmp, "\033bMax:\033n %ld", MaxVal );
               DoMethod( GR_Bound, OM_ADDMEMBER, mt_Text( tmp, "\033c" ) );
               }

           DoMethod( GR_Group, OM_ADDMEMBER, GR_Bound );
           }
       else
           {
           MUI_DisposeObject( Window );
           return( FALSE );
           }
       }

    mt_Sleep( TRUE );


    // notification
    DoMethod(Window   , MUIM_Notify, MUIA_Window_CloseRequest, TRUE ,MUIV_Notify_Application, 2 ,MUIM_Application_ReturnID, ID_CANCEL);
    DoMethod(BT_Ok    , MUIM_Notify, MUIA_Pressed, FALSE, MUIV_Notify_Application, 2 ,MUIM_Application_ReturnID, ID_OK);
    DoMethod(BT_Cancel, MUIM_Notify, MUIA_Pressed, FALSE, MUIV_Notify_Application, 2 ,MUIM_Application_ReturnID, ID_CANCEL);


    // setting up...
    if( WindowTitle )
       set( Window, MUIA_Window_Title, WindowTitle );

    if( Contents )
        setstring( ST_String, Contents );

    set( Window, MUIA_Window_ActiveObject, ST_String );

/*
    if( NoEmpty )
       set( BT_Ok, MUIA_Disabled,  (*(char *)getstring( ST_String ) == 0 ) );
*/


    mt_WinAttach( app, Window );


    // let's go

    {
    char  running = TRUE;
    ULONG signal  = 0;


    if(  mt_WinOpen( Window ) )
       {
       while(running)
          {
          switch (DoMethod(app, MUIM_Application_Input, &signal))
            {
            case ID_OK:
               {
               char *buf = getstring( ST_String );
               LONG val  = getnumstring( ST_String );

               if( buf[0] == 0 )
                   {
                   result = running = FALSE;
                   break;
                   }


               if( MinBound )
                   {
                   if( val < MinVal )
                       {
                       DisplayBeep(0);
                       set( Window, MUIA_Window_ActiveObject, ST_String );
                       break;
                       }
                   }

               if( MaxBound )
                   {
                   if( val > MaxVal )
                       {
                       DisplayBeep(0);
                       set( Window, MUIA_Window_ActiveObject, ST_String );
                       break;
                       }
                   }

               *value = val;
               result = TRUE;
               running = FALSE;
               }
               break;

            case ID_CANCEL:
               running = FALSE;
               break;

            }
          if(running && signal) Wait(signal);
          }

       mt_WinClose( Window );
       }
    else
       {
       DisplayBeep(0);
//       MUI_Request(app, MainWindow, 0, TITLE, MSG_OK, MSG_ERR_WINDOW);
       }
    }


    mt_WinDetach( app, Window );

    mt_Sleep( FALSE );

    return(result);


}
//|


/*
/// tmp
/*
Object *TextButton2(char *str, char *str2)
{
        Object *obj = MUI_NewObject(MUIC_Text,
                                ButtonFrame,
                                MUIA_Text_PreParse, "\33c",
                                MUIA_Text_Contents, str,
                                MUIA_CycleChain   , TRUE,
                                MUIA_InputMode    , MUIV_InputMode_RelVerify,
                                MUIA_Background   , MUII_ButtonBack,
                                MUIA_Text_HiChar  , (ULONG)( str2 )[0],
                                MUIA_ControlChar  , (ULONG)( str2 )[0],
                                TAG_DONE
                                );
        return(obj);
}
*/
/*
Object *SizedButton(char *str)
{
    Object *obj = VGroup,
                  ButtonFrame,
                  MUIA_ControlChar  , mt_ParseHotkey(str),
                  MUIA_Background   , MUII_ButtonBack,
                  MUIA_InputMode    , MUIV_InputMode_RelVerify,
                  MUIA_CycleChain   , TRUE,
                  Child, HVSpace,
                  Child, HGroup,
                         Child, HVSpace,
                         Child, MakeLabel2(str),
                         Child, HVSpace,
                         End,

                  Child, HVSpace,
                  End;

    return(obj);
}
*/
//|
*/

