79e185a1e7c690367768fc88308420cd51b0e5fd
[ncurses.git] / Ada95 / gen / terminal_interface-curses-forms-field_types.ads.m4
1 --  -*- ada -*-
2 define(`HTMLNAME',`terminal_interface-curses-forms-field_user_data_s.html')dnl
3 include(M4MACRO)dnl
4 ------------------------------------------------------------------------------
5 --                                                                          --
6 --                           GNAT ncurses Binding                           --
7 --                                                                          --
8 --                 Terminal_Interface.Curses.Forms.Field_Types              --
9 --                                                                          --
10 --                                 S P E C                                  --
11 --                                                                          --
12 ------------------------------------------------------------------------------
13 -- Copyright (c) 1998 Free Software Foundation, Inc.                        --
14 --                                                                          --
15 -- Permission is hereby granted, free of charge, to any person obtaining a  --
16 -- copy of this software and associated documentation files (the            --
17 -- "Software"), to deal in the Software without restriction, including      --
18 -- without limitation the rights to use, copy, modify, merge, publish,      --
19 -- distribute, distribute with modifications, sublicense, and/or sell       --
20 -- copies of the Software, and to permit persons to whom the Software is    --
21 -- furnished to do so, subject to the following conditions:                 --
22 --                                                                          --
23 -- The above copyright notice and this permission notice shall be included  --
24 -- in all copies or substantial portions of the Software.                   --
25 --                                                                          --
26 -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
27 -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
28 -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
29 -- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
30 -- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
31 -- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
32 -- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
33 --                                                                          --
34 -- Except as contained in this notice, the name(s) of the above copyright   --
35 -- holders shall not be used in advertising or otherwise to promote the     --
36 -- sale, use or other dealings in this Software without prior written       --
37 -- authorization.                                                           --
38 ------------------------------------------------------------------------------
39 --  Author: Juergen Pfeifer <Juergen.Pfeifer@T-Online.de> 1996
40 --  Version Control:
41 --  $Revision: 1.6 $
42 --  Binding Version 00.93
43 ------------------------------------------------------------------------------
44 with Terminal_Interface.Curses.Aux;
45
46 package Terminal_Interface.Curses.Forms.Field_Types is
47    pragma Preelaborate (Field_Types);
48
49    --  MANPAGE(`form_fieldtype.3x')
50
51    type Field_Type is abstract tagged null record;
52    --  Abstract base type for all field types. A concrete field type
53    --  is an extension that adds some data elements describing formats or
54    --  boundary values for the type and validation routines.
55    --  For the builtin low-level fieldtypes, the validation routines are
56    --  already defined by the low-level C library.
57    --  The builtin types like Alpha or AlphaNumeric etc. are defined in
58    --  child packages of this package. You may use one of them as example
59    --  how to create you own child packages for low-level field types that
60    --  you may have already written in C.
61
62    type Field_Type_Access is access all Field_Type'Class;
63
64    --  ANCHOR(`set_field_type()',`Set_Type')
65    procedure Set_Field_Type (Fld      : in Field;
66                              Fld_Type : in Field_Type) is abstract;
67    --  AKA
68    --  But: we hide the vararg mechanism of the C interface. You always
69    --       have to pass a single Field_Type parameter.
70
71    --  ---------------------------------------------------------------------
72
73    --  MANPAGE(`form_field_validation.3x')
74
75    --  ANCHOR(`field_type()',`Get_Type')
76    function Get_Type (Fld : in Field) return Field_Type_Access;
77    --  AKA
78    --  ALIAS(`field_arg()')
79    --  In Ada95 we can combine these. If you try to retrieve the field type
80    --  that is not defined as extension of the abstract tagged type above,
81    --  you will raise a Form_Exception.
82    --  This is not inlined
83
84    --  +----------------------------------------------------------------------
85    --  | Private Part.
86    --  | Most of this is used by the implementations of the child packages.
87    --  |
88 private
89    use Terminal_Interface.Curses.Aux;
90
91    type Makearg_Function is access
92      function (Args : System.Address) return System.Address;
93    pragma Convention (C, Makearg_Function);
94
95    type Copyarg_Function is access
96      function (Usr : System.Address) return System.Address;
97    pragma Convention (C, Copyarg_Function);
98
99    type Freearg_Function is access
100      procedure (Usr : System.Address);
101    pragma Convention (C, Freearg_Function);
102
103    type Field_Check_Function is access
104      function (Fld : Field; Usr : System.Address) return C_Int;
105    pragma Convention (C, Field_Check_Function);
106
107    type Char_Check_Function is access
108      function (Ch : C_Int; Usr : System.Address) return C_Int;
109    pragma Convention (C, Char_Check_Function);
110
111    type Choice_Function is access
112      function (Fld : Field; Usr : System.Address) return C_Int;
113    pragma Convention (C, Choice_Function);
114
115    --  +----------------------------------------------------------------------
116    --  | This must be in sync with the FIELDTYPE structure in form.h
117    --  |
118    type Low_Level_Field_Type is
119       record
120          Status :              C_Short;
121          Ref_Count :           C_Long_Int;
122          Left, Right :         System.Address;
123          Makearg :             Makearg_Function;
124          Copyarg :             Copyarg_Function;
125          Freearg :             Freearg_Function;
126          Fcheck :              Field_Check_Function;
127          Ccheck :              Char_Check_Function;
128          Next, Prev :          Choice_Function;
129       end record;
130    pragma Convention (C, Low_Level_Field_Type);
131    type C_Field_Type is access all Low_Level_Field_Type;
132
133    Null_Field_Type   : constant C_Field_Type := null;
134
135    --  +----------------------------------------------------------------------
136    --  | This four low-level fieldtypes are the ones associated with
137    --  | fieldtypes handled by this binding. Any other low-level fieldtype
138    --  | will result in a Form_Exception is function Get_Type.
139    --  |
140    M_Generic_Type   : C_Field_Type := null;
141    M_Generic_Choice : C_Field_Type := null;
142    M_Builtin_Router : C_Field_Type := null;
143    M_Choice_Router  : C_Field_Type := null;
144
145    --  Two wrapper functions to access those low-level fieldtypes defined
146    --  in this package.
147    function C_Builtin_Router return C_Field_Type;
148    function C_Choice_Router  return C_Field_Type;
149
150    procedure Wrap_Builtin (Fld : Field;
151                            Typ : Field_Type'Class;
152                            Cft : C_Field_Type := C_Builtin_Router);
153    --  This procedure has to be called by the Set_Field_Type implementation
154    --  for builtin low-level fieldtypes to replace it by an Ada95
155    --  conformant Field_Type object.
156    --  The parameter Cft must be C_Builtin_Router for regular low-level
157    --  fieldtypes (like TYP_ALPHA or TYP_ALNUM) and C_Choice_Router for
158    --  low-level fieldtypes witch choice functions (like TYP_ENUM).
159    --  Any other value will raise a Form_Exception.
160
161    function Make_Arg (Args : System.Address) return System.Address;
162    pragma Convention (C, Make_Arg);
163    --  This is the Makearg_Function for the internal low-level types
164    --  introduced by this binding.
165
166    function Copy_Arg (Usr : System.Address) return System.Address;
167    pragma Convention (C, Copy_Arg);
168    --  This is the Copyarg_Function for the internal low-level types
169    --  introduced by this binding.
170
171    procedure Free_Arg (Usr : System.Address);
172    pragma Convention (C, Free_Arg);
173    --  This is the Freearg_Function for the internal low-level types
174    --  introduced by this binding.
175
176    function Field_Check_Router (Fld : Field;
177                                 Usr : System.Address) return C_Int;
178    pragma Convention (C, Field_Check_Router);
179    --  This is the Field_Check_Function for the internal low-level types
180    --  introduced to wrap the low-level types by a Field_Type derived
181    --  type. It routes the call to the corresponding low-level validation
182    --  function.
183
184    function Char_Check_Router (Ch : C_Int;
185                                Usr : System.Address) return C_Int;
186    pragma Convention (C, Char_Check_Router);
187    --  This is the Char_Check_Function for the internal low-level types
188    --  introduced to wrap the low-level types by a Field_Type derived
189    --  type. It routes the call to the corresponding low-level validation
190    --  function.
191
192    function Next_Router (Fld : Field;
193                          Usr : System.Address) return C_Int;
194    pragma Convention (C, Next_Router);
195    --  This is the Choice_Function for the internal low-level types
196    --  introduced to wrap the low-level types by a Field_Type derived
197    --  type. It routes the call to the corresponding low-level next_choice
198    --  function.
199
200    function Prev_Router (Fld : Field;
201                          Usr : System.Address) return C_Int;
202    pragma Convention (C, Prev_Router);
203    --  This is the Choice_Function for the internal low-level types
204    --  introduced to wrap the low-level types by a Field_Type derived
205    --  type. It routes the call to the corresponding low-level prev_choice
206    --  function.
207
208    --  This is the Argument structure maintained by all low-level field types
209    --  introduced by this binding.
210    type Argument is record
211       Typ : Field_Type_Access;   --  the Field_Type creating this record
212       Usr : System.Address;      --  original arg for builtin low-level types
213       Cft : C_Field_Type;        --  the original low-level type
214    end record;
215    type Argument_Access is access all Argument;
216
217    --  +----------------------------------------------------------------------
218    --  |
219    --  | Some Imports of libform routines to deal with low-level fieldtypes.
220    --  |
221    function New_Fieldtype (Fcheck : Field_Check_Function;
222                            Ccheck : Char_Check_Function)
223      return C_Field_Type;
224    pragma Import (C, New_Fieldtype, "new_fieldtype");
225
226    function Set_Fieldtype_Arg (Cft : C_Field_Type;
227                                Mak : Makearg_Function := Make_Arg'Access;
228                                Cop : Copyarg_Function := Copy_Arg'Access;
229                                Fre : Freearg_Function := Free_Arg'Access)
230      return C_Int;
231    pragma Import (C, Set_Fieldtype_Arg, "set_fieldtype_arg");
232
233    function Set_Fieldtype_Choice (Cft : C_Field_Type;
234                                   Next, Prev : Choice_Function)
235      return C_Int;
236    pragma Import (C, Set_Fieldtype_Choice, "set_fieldtype_choice");
237
238 end Terminal_Interface.Curses.Forms.Field_Types;