--  Programmed by Jedidiah Barber
--  Released into the public domain


with

    FLTK.Widgets;


package FLTK.Menu_Items is


    type Menu_Item is new Wrapper with private;

    type Menu_Item_Reference (Data : not null access Menu_Item'Class) is limited null record
        with Implicit_Dereference => Data;




    package Forge is

        --  Usually you don't bother with this and just add items
        --  to Menus directly using the Add subprograms in that package.

        function Create
               (Text        : in String;
                Action      : in FLTK.Widgets.Widget_Callback := null;
                Shortcut    : in Key_Combo := No_Key;
                Flags       : in Menu_Flag := Flag_Normal)
            return Menu_Item;

    end Forge;




    function Get_Callback
           (Item : in Menu_Item)
        return FLTK.Widgets.Widget_Callback;

    procedure Set_Callback
           (Item : in out Menu_Item;
            Func : in     FLTK.Widgets.Widget_Callback);

    procedure Do_Callback
           (Item   : in out Menu_Item;
            Widget : in out FLTK.Widgets.Widget'Class);




    function Has_Checkbox
           (Item : in Menu_Item)
        return Boolean;

    function Is_Radio
           (Item : in Menu_Item)
        return Boolean;

    function Get_State
           (Item : in Menu_Item)
        return Boolean;

    procedure Set_State
           (Item : in out Menu_Item;
            To   : in     Boolean);

    procedure Set_Only
           (Item : in out Menu_Item);




    function Get_Label
           (Item : in Menu_Item)
        return String;

    procedure Set_Label
           (Item : in out Menu_Item;
            Text : in     String);

    function Get_Label_Color
           (Item : in Menu_Item)
        return Color;

    procedure Set_Label_Color
           (Item : in out Menu_Item;
            To   : in     Color);

    function Get_Label_Font
           (Item : in Menu_Item)
        return Font_Kind;

    procedure Set_Label_Font
           (Item : in out Menu_Item;
            To   : in     Font_Kind);

    function Get_Label_Size
           (Item : in Menu_Item)
        return Font_Size;

    procedure Set_Label_Size
           (Item : in out Menu_Item;
            To   : in     Font_Size);

    function Get_Label_Type
           (Item : in Menu_Item)
        return Label_Kind;

    procedure Set_Label_Type
           (Item : in out Menu_Item;
            To   : in     Label_Kind);




    function Get_Shortcut
           (Item : in Menu_Item)
        return Key_Combo;

    procedure Set_Shortcut
           (Item : in out Menu_Item;
            To   : in     Key_Combo);

    function Get_Flags
           (Item : in Menu_Item)
        return Menu_Flag;

    procedure Set_Flags
           (Item : in out Menu_Item;
            To   : in     Menu_Flag);




    procedure Activate
           (Item : in out Menu_Item);

    procedure Deactivate
           (Item : in out Menu_Item);

    procedure Show
           (Item : in out Menu_Item);

    procedure Hide
           (Item : in out Menu_Item);

    function Is_Active
           (Item : in Menu_Item)
        return Boolean;

    function Is_Visible
           (Item : in Menu_Item)
        return Boolean;

    function Is_Active_And_Visible
           (Item : in Menu_Item)
        return Boolean;


private


    type Menu_Item is new Wrapper with null record;

    overriding procedure Finalize
           (This : in out Menu_Item);




    pragma Inline (Get_Callback);
    pragma Inline (Set_Callback);
    pragma Inline (Do_Callback);


    pragma Inline (Has_Checkbox);
    pragma Inline (Is_Radio);
    pragma Inline (Get_State);
    pragma Inline (Set_State);
    pragma Inline (Set_Only);


    pragma Inline (Get_Label);
    pragma Inline (Set_Label);
    pragma Inline (Get_Label_Color);
    pragma Inline (Set_Label_Color);
    pragma Inline (Get_Label_Font);
    pragma Inline (Set_Label_Font);
    pragma Inline (Get_Label_Size);
    pragma Inline (Set_Label_Size);
    pragma Inline (Get_Label_Type);
    pragma Inline (Set_Label_Type);


    pragma Inline (Get_Shortcut);
    pragma Inline (Set_Shortcut);
    pragma Inline (Get_Flags);
    pragma Inline (Set_Flags);


    pragma Inline (Activate);
    pragma Inline (Deactivate);
    pragma Inline (Show);
    pragma Inline (Hide);
    pragma Inline (Is_Active);
    pragma Inline (Is_Visible);
    pragma Inline (Is_Active_And_Visible);


end FLTK.Menu_Items;