blob: 51682cd7ec8c912e3ad7910ddc53aba636c39087 [file] [log] [blame] [edit]
-- -*- ada -*-
define(`HTMLNAME',`terminal_interface-curses-forms-field_user_data__ads.htm')dnl
include(M4MACRO)dnl
------------------------------------------------------------------------------
-- --
-- GNAT ncurses Binding --
-- --
-- Terminal_Interface.Curses.Forms.Field_Types --
-- --
-- S P E C --
-- --
------------------------------------------------------------------------------
-- Copyright (c) 1998-2011,2014 Free Software Foundation, Inc. --
-- --
-- Permission is hereby granted, free of charge, to any person obtaining a --
-- copy of this software and associated documentation files (the --
-- "Software"), to deal in the Software without restriction, including --
-- without limitation the rights to use, copy, modify, merge, publish, --
-- distribute, distribute with modifications, sublicense, and/or sell --
-- copies of the Software, and to permit persons to whom the Software is --
-- furnished to do so, subject to the following conditions: --
-- --
-- The above copyright notice and this permission notice shall be included --
-- in all copies or substantial portions of the Software. --
-- --
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --
-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --
-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, --
-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR --
-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR --
-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. --
-- --
-- Except as contained in this notice, the name(s) of the above copyright --
-- holders shall not be used in advertising or otherwise to promote the --
-- sale, use or other dealings in this Software without prior written --
-- authorization. --
------------------------------------------------------------------------------
-- Author: Juergen Pfeifer, 1996
-- Version Control:
-- $Revision: 1.19 $
-- Binding Version 01.00
------------------------------------------------------------------------------
with Interfaces.C;
with Terminal_Interface.Curses.Aux;
package Terminal_Interface.Curses.Forms.Field_Types is
pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types);
use type Interfaces.C.int;
subtype C_Int is Interfaces.C.int;
-- MANPAGE(`form_fieldtype.3x')
type Field_Type is abstract tagged null record;
-- Abstract base type for all field types. A concrete field type
-- is an extension that adds some data elements describing formats or
-- boundary values for the type and validation routines.
-- For the builtin low-level fieldtypes, the validation routines are
-- already defined by the low-level C library.
-- The builtin types like Alpha or AlphaNumeric etc. are defined in
-- child packages of this package. You may use one of them as example
-- how to create you own child packages for low-level field types that
-- you may have already written in C.
type Field_Type_Access is access all Field_Type'Class;
-- ANCHOR(`set_field_type()',`Set_Type')
procedure Set_Field_Type (Fld : Field;
Fld_Type : Field_Type) is abstract;
-- AKA
-- But: we hide the vararg mechanism of the C interface. You always
-- have to pass a single Field_Type parameter.
-- ---------------------------------------------------------------------
-- MANPAGE(`form_field_validation.3x')
-- ANCHOR(`field_type()',`Get_Type')
function Get_Type (Fld : Field) return Field_Type_Access;
-- AKA
-- ALIAS(`field_arg()')
-- In Ada95 we can combine these. If you try to retrieve the field type
-- that is not defined as extension of the abstract tagged type above,
-- you will raise a Form_Exception.
-- This is not inlined
-- +----------------------------------------------------------------------
-- | Private Part.
-- | Most of this is used by the implementations of the child packages.
-- |
private
type Makearg_Function is access
function (Args : System.Address) return System.Address;
pragma Convention (C, Makearg_Function);
type Copyarg_Function is access
function (Usr : System.Address) return System.Address;
pragma Convention (C, Copyarg_Function);
type Freearg_Function is access
procedure (Usr : System.Address);
pragma Convention (C, Freearg_Function);
type Field_Check_Function is access
function (Fld : Field; Usr : System.Address) return Curses_Bool;
pragma Convention (C, Field_Check_Function);
type Char_Check_Function is access
function (Ch : C_Int; Usr : System.Address) return Curses_Bool;
pragma Convention (C, Char_Check_Function);
type Choice_Function is access
function (Fld : Field; Usr : System.Address) return Curses_Bool;
pragma Convention (C, Choice_Function);
-- +----------------------------------------------------------------------
-- | This must be in sync with the FIELDTYPE structure in form.h
-- |
type Low_Level_Field_Type is
record
Status : Interfaces.C.unsigned_short;
Ref_Count : Interfaces.C.long;
Left, Right : System.Address;
Makearg : Makearg_Function;
Copyarg : Copyarg_Function;
Freearg : Freearg_Function;
Fcheck : Field_Check_Function;
Ccheck : Char_Check_Function;
Next, Prev : Choice_Function;
end record;
pragma Convention (C, Low_Level_Field_Type);
type C_Field_Type is access all Low_Level_Field_Type;
Null_Field_Type : constant C_Field_Type := null;
-- +----------------------------------------------------------------------
-- | This four low-level fieldtypes are the ones associated with
-- | fieldtypes handled by this binding. Any other low-level fieldtype
-- | will result in a Form_Exception is function Get_Type.
-- |
M_Generic_Type : C_Field_Type := null;
M_Generic_Choice : C_Field_Type := null;
M_Builtin_Router : C_Field_Type := null;
M_Choice_Router : C_Field_Type := null;
-- Two wrapper functions to access those low-level fieldtypes defined
-- in this package.
function C_Builtin_Router return C_Field_Type;
function C_Choice_Router return C_Field_Type;
procedure Wrap_Builtin (Fld : Field;
Typ : Field_Type'Class;
Cft : C_Field_Type := C_Builtin_Router);
-- This procedure has to be called by the Set_Field_Type implementation
-- for builtin low-level fieldtypes to replace it by an Ada95
-- conformant Field_Type object.
-- The parameter Cft must be C_Builtin_Router for regular low-level
-- fieldtypes (like TYP_ALPHA or TYP_ALNUM) and C_Choice_Router for
-- low-level fieldtypes witch choice functions (like TYP_ENUM).
-- Any other value will raise a Form_Exception.
function Make_Arg (Args : System.Address) return System.Address;
pragma Import (C, Make_Arg, "void_star_make_arg");
-- This is the Makearg_Function for the internal low-level types
-- introduced by this binding.
function Copy_Arg (Usr : System.Address) return System.Address;
pragma Convention (C, Copy_Arg);
-- This is the Copyarg_Function for the internal low-level types
-- introduced by this binding.
procedure Free_Arg (Usr : System.Address);
pragma Convention (C, Free_Arg);
-- This is the Freearg_Function for the internal low-level types
-- introduced by this binding.
function Field_Check_Router (Fld : Field;
Usr : System.Address) return Curses_Bool;
pragma Convention (C, Field_Check_Router);
-- This is the Field_Check_Function for the internal low-level types
-- introduced to wrap the low-level types by a Field_Type derived
-- type. It routes the call to the corresponding low-level validation
-- function.
function Char_Check_Router (Ch : C_Int;
Usr : System.Address) return Curses_Bool;
pragma Convention (C, Char_Check_Router);
-- This is the Char_Check_Function for the internal low-level types
-- introduced to wrap the low-level types by a Field_Type derived
-- type. It routes the call to the corresponding low-level validation
-- function.
function Next_Router (Fld : Field;
Usr : System.Address) return Curses_Bool;
pragma Convention (C, Next_Router);
-- This is the Choice_Function for the internal low-level types
-- introduced to wrap the low-level types by a Field_Type derived
-- type. It routes the call to the corresponding low-level next_choice
-- function.
function Prev_Router (Fld : Field;
Usr : System.Address) return Curses_Bool;
pragma Convention (C, Prev_Router);
-- This is the Choice_Function for the internal low-level types
-- introduced to wrap the low-level types by a Field_Type derived
-- type. It routes the call to the corresponding low-level prev_choice
-- function.
-- This is the Argument structure maintained by all low-level field types
-- introduced by this binding.
type Argument is record
Typ : Field_Type_Access; -- the Field_Type creating this record
Usr : System.Address; -- original arg for builtin low-level types
Cft : C_Field_Type; -- the original low-level type
end record;
type Argument_Access is access all Argument;
-- +----------------------------------------------------------------------
-- |
-- | Some Imports of libform routines to deal with low-level fieldtypes.
-- |
function New_Fieldtype (Fcheck : Field_Check_Function;
Ccheck : Char_Check_Function)
return C_Field_Type;
pragma Import (C, New_Fieldtype, "new_fieldtype");
function Set_Fieldtype_Arg (Cft : C_Field_Type;
Mak : Makearg_Function := Make_Arg'Access;
Cop : Copyarg_Function := Copy_Arg'Access;
Fre : Freearg_Function := Free_Arg'Access)
return Aux.Eti_Error;
pragma Import (C, Set_Fieldtype_Arg, "set_fieldtype_arg");
function Set_Fieldtype_Choice (Cft : C_Field_Type;
Next, Prev : Choice_Function)
return Aux.Eti_Error;
pragma Import (C, Set_Fieldtype_Choice, "set_fieldtype_choice");
end Terminal_Interface.Curses.Forms.Field_Types;