#define MUIMASTER_NAME 'muimaster.library'

#define MUIC_Notify      'Notify.mui'
#define MUIC_Family      'Family.mui'
#define MUIC_Menustrip   'Menustrip.mui'
#define MUIC_Menu        'Menu.mui'
#define MUIC_Menuitem    'Menuitem.mui'
#define MUIC_Application 'Application.mui'
#define MUIC_Window      'Window.mui'
#define MUIC_Area        'Area.mui'
#define MUIC_Rectangle   'Rectangle.mui'
#define MUIC_Image       'Image.mui'
#define MUIC_Bitmap      'Bitmap.mui'
#define MUIC_Bodychunk   'Bodychunk.mui'
#define MUIC_Text        'Text.mui'
#define MUIC_String      'String.mui'
#define MUIC_Prop        'Prop.mui'
#define MUIC_Gauge       'Gauge.mui'
#define MUIC_Scale       'Scale.mui'
#define MUIC_Boopsi      'Boopsi.mui'
#define MUIC_Colorfield  'Colorfield.mui'
#define MUIC_List        'List.mui'
#define MUIC_Floattext   'Floattext.mui'
#define MUIC_Volumelist  'Volumelist.mui'
#define MUIC_Scrmodelist 'Scrmodelist.mui'
#define MUIC_Dirlist     'Dirlist.mui'
#define MUIC_Group       'Group.mui'
#define MUIC_Register    'Register.mui'
#define MUIC_Virtgroup   'Virtgroup.mui'
#define MUIC_Scrollgroup 'Scrollgroup.mui'
#define MUIC_Scrollbar   'Scrollbar.mui'
#define MUIC_Listview    'Listview.mui'
#define MUIC_Radio       'Radio.mui'
#define MUIC_Cycle       'Cycle.mui'
#define MUIC_Slider      'Slider.mui'
#define MUIC_Coloradjust 'Coloradjust.mui'
#define MUIC_Palette     'Palette.mui'
#define MUIC_Colorpanel  'Colorpanel.mui'
#define MUIC_Popstring   'Popstring.mui'
#define MUIC_Popobject   'Popobject.mui'
#define MUIC_Poplist     'Poplist.mui'
#define MUIC_Popasl      'Popasl.mui'

#define MUIX_R '\er'
#define MUIX_C '\ec'
#define MUIX_L '\el'
#define MUIX_N '\en'
#define MUIX_B '\eb'
#define MUIX_I '\ei'
#define MUIX_U '\eu'
#define MUIX_PT '\e2'
#define MUIX_PH '\e8'

#define MenustripObject   Mui_NewObjectA(MUIC_Menustrip,[TAG_IGNORE,0
#define MenuObject        Mui_NewObjectA(MUIC_Menu,[TAG_IGNORE,0
#define MenuObjectT(name) Mui_NewObjectA(MUIC_Menu,[MUIA_Menu_Title,name
#define MenuitemObject    Mui_NewObjectA(MUIC_Menuitem,[TAG_IGNORE,0
#define WindowObject      Mui_NewObjectA(MUIC_Window,[TAG_IGNORE,0
#define ImageObject       Mui_NewObjectA(MUIC_Image,[TAG_IGNORE,0
#define BitmapObject      Mui_NewObjectA(MUIC_Bitmap,[TAG_IGNORE,0
#define BodychunkObject   Mui_NewObjectA(MUIC_Bodychunk,[TAG_IGNORE,0
#define NotifyObject      Mui_NewObjectA(MUIC_Notify,[TAG_IGNORE,0
#define ApplicationObject Mui_NewObjectA(MUIC_Application,[TAG_IGNORE,0
#define TextObject        Mui_NewObjectA(MUIC_Text,[TAG_IGNORE,0
#define RectangleObject   Mui_NewObjectA(MUIC_Rectangle,[TAG_IGNORE,0
#define ListObject        Mui_NewObjectA(MUIC_List,[TAG_IGNORE,0
#define PropObject        Mui_NewObjectA(MUIC_Prop,[TAG_IGNORE,0
#define StringObject      Mui_NewObjectA(MUIC_String,[TAG_IGNORE,0
#define ScrollbarObject   Mui_NewObjectA(MUIC_Scrollbar,[TAG_IGNORE,0
#define ListviewObject    Mui_NewObjectA(MUIC_Listview,[TAG_IGNORE,0
#define RadioObject       Mui_NewObjectA(MUIC_Radio,[TAG_IGNORE,0
#define VolumelistObject  Mui_NewObjectA(MUIC_Volumelist,[TAG_IGNORE,0
#define FloattextObject   Mui_NewObjectA(MUIC_Floattext,[TAG_IGNORE,0
#define DirlistObject     Mui_NewObjectA(MUIC_Dirlist,[TAG_IGNORE,0
#define SliderObject      Mui_NewObjectA(MUIC_Slider,[TAG_IGNORE,0
#define CycleObject       Mui_NewObjectA(MUIC_Cycle,[TAG_IGNORE,0
#define GaugeObject       Mui_NewObjectA(MUIC_Gauge,[TAG_IGNORE,0
#define ScaleObject       Mui_NewObjectA(MUIC_Scale,[TAG_IGNORE,0
#define BoopsiObject      Mui_NewObjectA(MUIC_Boopsi,[TAG_IGNORE,0
#define ColorfieldObject  Mui_NewObjectA(MUIC_Colorfield,[TAG_IGNORE,0
#define ColorpanelObject  Mui_NewObjectA(MUIC_Colorpanel,[TAG_IGNORE,0
#define ColoradjustObject Mui_NewObjectA(MUIC_Coloradjust,[TAG_IGNORE,0
#define PaletteObject     Mui_NewObjectA(MUIC_Palette,[TAG_IGNORE,0
#define GroupObject       Mui_NewObjectA(MUIC_Group,[TAG_IGNORE,0
#define RegisterObject    Mui_NewObjectA(MUIC_Register,[TAG_IGNORE,0
#define VirtgroupObject   Mui_NewObjectA(MUIC_Virtgroup,[TAG_IGNORE,0
#define ScrollgroupObject Mui_NewObjectA(MUIC_Scrollgroup,[TAG_IGNORE,0
#define PopstringObject   Mui_NewObjectA(MUIC_Popstring,[TAG_IGNORE,0
#define PopobjectObject   Mui_NewObjectA(MUIC_Popobject,[TAG_IGNORE,0
#define PoplistObject     Mui_NewObjectA(MUIC_Poplist,[TAG_IGNORE,0
#define PopaslObject      Mui_NewObjectA(MUIC_Popasl,[TAG_IGNORE,0
#define ScrmodelistObject Mui_NewObjectA(MUIC_Scrmodelist,[TAG_IGNORE,0
#define VGroup            Mui_NewObjectA(MUIC_Group,[TAG_IGNORE,0
#define HGroup            Mui_NewObjectA(MUIC_Group,[MUIA_Group_Horiz,MUI_TRUE
#define ColGroup(cols)    Mui_NewObjectA(MUIC_Group,[MUIA_Group_Columns,(cols)
#define RowGroup(rows)    Mui_NewObjectA(MUIC_Group,[MUIA_Group_Rows   ,(rows)
#define PageGroup         Mui_NewObjectA(MUIC_Group,[MUIA_Group_PageMode,MUI_TRUE
#define VGroupV           Mui_NewObjectA(MUIC_Virtgroup,[TAG_IGNORE,0
#define HGroupV           Mui_NewObjectA(MUIC_Virtgroup,[MUIA_Group_Horiz,MUI_TRUE
#define ColGroupV(cols)   Mui_NewObjectA(MUIC_Virtgroup,[MUIA_Group_Columns,(cols)
#define RowGroupV(rows)   Mui_NewObjectA(MUIC_Virtgroup,[MUIA_Group_Rows   ,(rows)
#define PageGroupV        Mui_NewObjectA(MUIC_Virtgroup,[MUIA_Group_PageMode,MUI_TRUE
#define RegisterGroup(t)  Mui_NewObjectA(MUIC_Register,[MUIA_Register_Titles,(t)
#define End               TAG_DONE])

#define Child             MUIA_Group_Child
#define SubWindow         MUIA_Application_Window
#define WindowContents    MUIA_Window_RootObject

#define NoFrame          MUIA_Frame, MUIV_Frame_None
#define ButtonFrame      MUIA_Frame, MUIV_Frame_Button
#define ImageButtonFrame MUIA_Frame, MUIV_Frame_ImageButton
#define TextFrame        MUIA_Frame, MUIV_Frame_Text
#define StringFrame      MUIA_Frame, MUIV_Frame_String
#define ReadListFrame    MUIA_Frame, MUIV_Frame_ReadList
#define InputListFrame   MUIA_Frame, MUIV_Frame_InputList
#define PropFrame        MUIA_Frame, MUIV_Frame_Prop
#define SliderFrame      MUIA_Frame, MUIV_Frame_Slider
#define GaugeFrame       MUIA_Frame, MUIV_Frame_Gauge
#define VirtualFrame     MUIA_Frame, MUIV_Frame_Virtual
#define GroupFrame       MUIA_Frame, MUIV_Frame_Group
#define GroupFrameT(s)   MUIA_Frame, MUIV_Frame_Group, MUIA_FrameTitle, s
#define HVSpace           Mui_NewObjectA(MUIC_Rectangle,[TAG_DONE])
#define HSpace(x)         Mui_MakeObjectA(MUIO_HSpace,[x])
#define VSpace(x)         Mui_MakeObjectA(MUIO_VSpace,[x])
#define HCenter(obj)      HGroup, GroupSpacing(0), Child, HSpace(0), Child, (obj), Child, HSpace(0), End
#define VCenter(obj)      VGroup, GroupSpacing(0), Child, VSpace(0), Child, (obj), Child, VSpace(0), End
#define InnerSpacing(h,v) MUIA_InnerLeft,(h),MUIA_InnerRight,(h),MUIA_InnerTop,(v),MUIA_InnerBottom,(v)
#define GroupSpacing(x)   MUIA_Group_Spacing,x

#define StringMUI(contents,maxlen)\
        StringObject,\
                StringFrame,\
                MUIA_String_MaxLen  , maxlen,\
                MUIA_String_Contents, contents,\
                End

#define KeyString(contents,maxlen,controlchar)\
        StringObject,\
                StringFrame,\
                MUIA_ControlChar    , controlchar,\
                MUIA_String_MaxLen  , maxlen,\
                MUIA_String_Contents, contents,\
                End

#define CheckMark(selected)\
        ImageObject,\
                ImageButtonFrame,\
                MUIA_InputMode        , MUIV_InputMode_Toggle,\
                MUIA_Image_Spec       , MUII_CheckMark,\
                MUIA_Image_FreeVert   , MUI_TRUE,\
                MUIA_Selected         , selected,\
                MUIA_Background       , MUII_ButtonBack,\
                MUIA_ShowSelState     , FALSE,\
                End

#define KeyCheckMark(selected,control)\
        ImageObject,\
                ImageButtonFrame,\
                MUIA_InputMode        , MUIV_InputMode_Toggle,\
                MUIA_Image_Spec       , MUII_CheckMark,\
                MUIA_Image_FreeVert   , MUI_TRUE,\
                MUIA_Selected         , selected,\
                MUIA_Background       , MUII_ButtonBack,\
                MUIA_ShowSelState     , FALSE,\
                MUIA_ControlChar      , control,\
                End

#define SimpleButton(label) Mui_MakeObjectA(MUIO_Button,[label])

#define KeyButton(name,key)\
        TextObject,\
                ButtonFrame,\
                MUIA_Text_Contents, name,\
                MUIA_Text_PreParse, '\ec',\
                MUIA_Text_HiChar  , key,\
                MUIA_ControlChar  , key,\
                MUIA_InputMode    , MUIV_InputMode_RelVerify,\
                MUIA_Background   , MUII_ButtonBack,\
                End

#define Cycle(entries)        CycleObject, MUIA_Cycle_Entries, entries, End
#define KeyCycle(entries,key) CycleObject, MUIA_Cycle_Entries, entries, MUIA_ControlChar, key, End

#define Radio(name,array)\
        RadioObject,\
                GroupFrameT(name),\
                MUIA_Radio_Entries,array,\
                End

#define KeyRadio(name,array,key)\
        RadioObject,\
                GroupFrameT(name),\
                MUIA_Radio_Entries,array,\
                MUIA_ControlChar, key,\
                End

#define Slider(min,max,level)\
        SliderObject,\
                MUIA_Slider_Min  , min,\
                MUIA_Slider_Max  , max,\
                MUIA_Slider_Level, level,\
                End

#define KeySlider(min,max,level,key)\
        SliderObject,\
                MUIA_Slider_Min  , min,\
                MUIA_Slider_Max  , max,\
                MUIA_Slider_Level, level,\
                MUIA_ControlChar , key,\
                End

#define PopButton(img) Mui_MakeObjectA(MUIO_PopButton,[img])

#define Label(label)   Mui_MakeObjectA(MUIO_Label,[label,0])
#define Label1(label)  Mui_MakeObjectA(MUIO_Label,[label,MUIO_Label_SingleFrame])
#define Label2(label)  Mui_MakeObjectA(MUIO_Label,[label,MUIO_Label_DoubleFrame])
#define LLabel(label)  Mui_MakeObjectA(MUIO_Label,[label,MUIO_Label_LeftAligned])
#define LLabel1(label) Mui_MakeObjectA(MUIO_Label,[label,MUIO_Label_LeftAligned + MUIO_Label_SingleFrame])
#define LLabel2(label) Mui_MakeObjectA(MUIO_Label,[label,MUIO_Label_LeftAligned + MUIO_Label_DoubleFrame])

#define KeyLabel(label,key)   Mui_MakeObjectA(MUIO_Label,[label,key])
#define KeyLabel1(label,key)  Mui_MakeObjectA(MUIO_Label,[label,Or(MUIO_Label_SingleFrame,key)])
#define KeyLabel2(label,key)  Mui_MakeObjectA(MUIO_Label,[label,Or(MUIO_Label_DoubleFrame,key)])
#define KeyLLabel(label,key)  Mui_MakeObjectA(MUIO_Label,[label,Or(MUIO_Label_LeftAligned,key)])
#define KeyLLabel1(label,key) Mui_MakeObjectA(MUIO_Label,[label,Or(MUIO_Label_LeftAligned + MUIO_Label_SingleFrame,key)])
#define KeyLLabel2(label,key) Mui_MakeObjectA(MUIO_Label,[label,Or(MUIO_Label_LeftAligned + MUIO_Label_DoubleFrame,key)])

#define get(obj,attr,store) GetAttr(attr,obj,store)
#define set(obj,attr,value) SetAttrsA(obj,[Eval(`(attr)),value,TAG_DONE])
#define nnset(obj,attr,value) SetAttrsA(obj,[MUIA_NoNotify,MUI_TRUE,Eval(`(attr)),value,TAG_DONE])

#define setmutex(obj,n)     set(obj,MUIA_Radio_Active,n)
#define setcycle(obj,n)     set(obj,MUIA_Cycle_Active,n)
#define setstring(obj,s)    set(obj,MUIA_String_Contents,s)
#define setcheckmark(obj,b) set(obj,MUIA_Selected,b)
#define setslider(obj,l)    set(obj,MUIA_Slider_Level,l)

#define MUIP_BoopsiQuery MUI_BoopsiQuery

#define MUIV_Window_AltHeight_MinMax(p) (0-(p))
#define MUIV_Window_AltHeight_Visible(p) (-100-(p))
#define MUIV_Window_AltHeight_Screen(p) (-200-(p))
#define MUIV_Window_AltTopEdge_Delta(p) (-3-(p))
#define MUIV_Window_AltWidth_MinMax(p) (0-(p))
#define MUIV_Window_AltWidth_Visible(p) (-100-(p))
#define MUIV_Window_AltWidth_Screen(p) (-200-(p))
#define MUIV_Window_Height_MinMax(p) (0-(p))
#define MUIV_Window_Height_Visible(p) (-100-(p))
#define MUIV_Window_Height_Screen(p) (-200-(p))
#define MUIV_Window_TopEdge_Delta(p) (-3-(p))
#define MUIV_Window_Width_MinMax(p) (0-(p))
#define MUIV_Window_Width_Visible(p) (-100-(p))
#define MUIV_Window_Width_Screen(p) (-200-(p))

/* To use the following macros, Ev3 and the Ev3_mui.m-module is needed! */
/* ATTENTION: <obj> MUST be a <var>, not a <varexp> or <exp> !! */

#define muiNotifyData(obj) obj::__dummyxfc2__.mnd
#define muiAreaData(obj)   obj::__dummyxfc2__.mad
#define muiGlobalInfo(obj) obj::__dummyxfc2__.mnd.mnd_GlobalInfo
#define muiUserData(obj)   obj::__dummyxfc2__.mnd.mnd_UserData
#define muiRenderInfo(obj) obj::__dummyxfc2__.mad.mad_RenderInfo

#define _app(obj)         (muiGlobalInfo(obj).mgi_ApplicationObject)
#define _win(obj)         (muiRenderInfo(obj).mri_WindowObject)
#define _dri(obj)         (muiRenderInfo(obj).mri_DrawInfo)
#define _window(obj)      (muiRenderInfo(obj).mri_Window)
#define _screen(obj)      (muiRenderInfo(obj).mri_Screen)
#define _rp(obj)          (muiRenderInfo(obj).mri_RastPort)
#define _left(obj)        (muiAreaData(obj).mad_Box.Left)
#define _top(obj)         (muiAreaData(obj).mad_Box.Top)
#define _width(obj)       (muiAreaData(obj).mad_Box.Width)
#define _height(obj)      (muiAreaData(obj).mad_Box.Height)
#define _right(obj)       (_left(obj)+_width(obj)-1)
#define _bottom(obj)      (_top(obj)+_height(obj)-1)
#define _addleft(obj)     (muiAreaData(obj).mad_addleft)
#define _addtop(obj)      (muiAreaData(obj).mad_addtop)
#define _subwidth(obj)    (muiAreaData(obj).mad_subwidth)
#define _subheight(obj)   (muiAreaData(obj).mad_subheight)
#define _mleft(obj)       (_left(obj)+_addleft(obj))
#define _mtop(obj)        (_top(obj)+_addtop(obj))
#define _mwidth(obj)      (_width(obj)-_subwidth(obj))
#define _mheight(obj)     (_height(obj)-_subheight(obj))
#define _mright(obj)      (_mleft(obj)+_mwidth(obj)-1)
#define _mbottom(obj)     (_mtop(obj)+_mheight(obj)-1)
#define _font(obj)        (muiAreaData(obj).mad_Font)
#define _flags(obj)       (muiAreaData(obj).mad_Flags)

