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


with

    FLTK.Widgets.Groups.Windows;

private with

    Ada.Containers.Vectors,
    System.Address_To_Access_Conversions;


package FLTK.Event is


    type Event_Handler is access function
           (Event : in Event_Kind)
        return Event_Outcome;

    --  type Event_Dispatch is access function
    --         (Event : in     Event_Kind;
    --          Win   : access FLTK.Widgets.Groups.Windows.Window'Class)
    --      return Event_Outcome;




    procedure Add_Handler
           (Func : in Event_Handler);

    procedure Remove_Handler
           (Func : in Event_Handler);

    --  function Get_Dispatch
    --      return Event_Dispatch;

    --  procedure Set_Dispatch
    --         (Func : in Event_Dispatch);

    --  function Default_Dispatch
    --         (Event : in     Event_Kind;
    --          Win   : access FLTK.Widgets.Groups.Windows.Window'Class)
    --      return Event_Outcome;




    function Get_Grab
        return access FLTK.Widgets.Groups.Windows.Window'Class;

    procedure Set_Grab
           (To : in FLTK.Widgets.Groups.Windows.Window'Class);

    procedure Release_Grab;

    function Get_Pushed
        return access FLTK.Widgets.Widget'Class;

    procedure Set_Pushed
           (To : in FLTK.Widgets.Widget'Class);

    function Get_Below_Mouse
        return access FLTK.Widgets.Widget'Class;

    procedure Set_Below_Mouse
           (To : in FLTK.Widgets.Widget'Class);

    function Get_Focus
        return access FLTK.Widgets.Widget'Class;

    procedure Set_Focus
           (To : in FLTK.Widgets.Widget'Class);




    function Compose
           (Del : out Natural)
        return Boolean;

    procedure Compose_Reset;

    function Text
        return String;

    function Text_Length
        return Natural;




    function Last
        return Event_Kind;

    function Last_Modifier
        return Modifier;

    function Last_Modifier
           (Had : in Modifier)
        return Boolean;




    function Mouse_X
        return Integer;

    function Mouse_X_Root
        return Integer;

    function Mouse_Y
        return Integer;

    function Mouse_Y_Root
        return Integer;

    function Mouse_DX
        return Integer;

    function Mouse_DY
        return Integer;

    procedure Get_Mouse
           (X, Y : out Integer);

    function Is_Click
        return Boolean;

    function Is_Multi_Click
        return Boolean;

    procedure Set_Clicks
           (To : in Natural);

    function Last_Button
        return Mouse_Button;

    function Mouse_Left
        return Boolean;

    function Mouse_Middle
        return Boolean;

    function Mouse_Right
        return Boolean;

    function Is_Inside
           (X, Y, W, H : in Integer)
        return Boolean;




    function Last_Key
        return Keypress;

    function Original_Last_Key
        return Keypress;

    function Pressed_During
           (Key : in Keypress)
        return Boolean;

    function Key_Now
           (Key : in Keypress)
        return Boolean;

    function Key_Ctrl
        return Boolean;

    function Key_Alt
        return Boolean;

    function Key_Command
        return Boolean;

    function Key_Shift
        return Boolean;


private


    package Widget_Convert is new System.Address_To_Access_Conversions
        (FLTK.Widgets.Widget'Class);
    package Window_Convert is new System.Address_To_Access_Conversions
        (FLTK.Widgets.Groups.Windows.Window'Class);


    package Handler_Vectors is new Ada.Containers.Vectors
        (Index_Type => Positive, Element_Type => Event_Handler);


    Handlers : Handler_Vectors.Vector := Handler_Vectors.Empty_Vector;
    --  Current_Dispatch : Event_Dispatch := null;


    function fl_widget_get_user_data
           (W : in Storage.Integer_Address)
        return Storage.Integer_Address;
    pragma Import (C, fl_widget_get_user_data, "fl_widget_get_user_data");
    pragma Inline (fl_widget_get_user_data);




    pragma Inline (Add_Handler);
    pragma Inline (Remove_Handler);
    --  pragma Inline (Get_Dispatch);
    --  pragma Inline (Set_Dispatch);
    --  pragma Inline (Default_Dispatch);


    pragma Inline (Get_Grab);
    pragma Inline (Set_Grab);
    pragma Inline (Release_Grab);
    pragma Inline (Get_Pushed);
    pragma Inline (Set_Pushed);
    pragma Inline (Get_Below_Mouse);
    pragma Inline (Set_Below_Mouse);
    pragma Inline (Get_Focus);
    pragma Inline (Set_Focus);


    pragma Inline (Compose);
    pragma Inline (Compose_Reset);
    pragma Inline (Text);
    pragma Inline (Text_Length);


    pragma Inline (Last);
    pragma Inline (Last_Modifier);


    pragma Inline (Mouse_X);
    pragma Inline (Mouse_X_Root);
    pragma Inline (Mouse_Y);
    pragma Inline (Mouse_Y_Root);
    pragma Inline (Mouse_DX);
    pragma Inline (Mouse_DY);
    pragma Inline (Get_Mouse);
    pragma Inline (Is_Click);
    pragma Inline (Is_Multi_Click);
    pragma Inline (Set_Clicks);
    pragma Inline (Last_Button);
    pragma Inline (Mouse_Left);
    pragma Inline (Mouse_Middle);
    pragma Inline (Mouse_Right);
    pragma Inline (Is_Inside);


    pragma Inline (Last_Key);
    pragma Inline (Original_Last_Key);
    pragma Inline (Pressed_During);
    pragma Inline (Key_Now);
    pragma Inline (Key_Ctrl);
    pragma Inline (Key_Alt);
    pragma Inline (Key_Command);
    pragma Inline (Key_Shift);


end FLTK.Event;