.SH
Module flp
.LP
The flp module loads fl-forms from fd files, as generated
by fdesign. The module is designed to be flexible enough to allow
almost anything to be done with the loaded form.
.LP
Loadform defines 
two types of functions: functions to parse fd files and functions to
create the forms from the templates returned by the parse functions.
There are fairly low-level create functions that create single objects,
and convenience routines that create complete forms, including callbacks,
etc.
.LP
The exception flp.error is raised whenever an error occurs while parsing a forms
definition file or creating a form.
.SH 2
Parsing functions
.LP
There are two parsing functions, parse_form() and parse_forms(). They
take the following form:
.LP
.ft C
ftuple = parse_form(filename, formname)
.br
ftdict = parse_forms(filename)
.IP
Parse_form parses a single form, and returns a tuple (ftmp, otmplist).
Ftmp is a template for a form, otmplist is a list of templates for
objects. See below for a description of these templates.
.IP
Parse_forms parses all forms in an fd file. It returns a dictionary of
(ftmp, otmplist) tuples, indexed by formname.
.IP
Filename is the name of the forms definition file to inspect. The functions
appends '.fd' if needed, and use 'sys.path' to locate the file.
.IP
formname is the name of the form to load. This argument is mandatory,
even if the file only contains one form.
.LP
The form template and object template are structures that contain all
the information read from the fd file, in 'natural' form. A form
template record contains the following fields:
.IP
.nf
"Name", the name of the form;
"Width", the width of the form;
"Height", the height of the form; and
"Numberofobjects", the number of objects in the form.
.LP
An object template contains the following fields:
.IP
.nf
"Class", the class of object (eg. FL.BUTTON);
"Type", the sub-class (eg. FL.NORMALBUTTON);
"Box", a list with four members: [x, y, width, height];
"Boxtype", the type of box (eg. FL.DOWNBOX);
"Colors", a list with the two object colors;
"Alignment", the label alignment (eg. FL.ALIGNLEFT); 
"Style", the label style (eg. FL.BOLDSTYLE);
"Lcol", the label color;
"Label", a string containing the label;
"Name", a string containing the name of the object;
"Callback", a string containing the callback routine name; and
"Argument", a string containing the callback routine extra argument.
.SH
Low-level create routines.
.LP
The three low-level creation routines are called as follows:
.LP
.ft C
form = create_form(form_template)
.IP
Create an fl form from a form template. Returns the form created.
.LP
.ft C
obj = create_object(form, obj_template)
.IP
Create an object in an fl form. Return the new object.
An error is raised if the object has a callback routine.
.SH
High-level create routines.
.LP
The 'standard' way to handle forms in python is to define a class
that contains the form and all the objects (insofar as they are named),
and that defines all the callback functions, and use an instance of
this class to handle the form interaction.
Flp contains three routines that simplify handling this paradigm:
.LP
.ft C
create_full_form(instance, ftuple)
.IP
This routine takes an instance of your form-handling class and an
ftuple (as returned by the parsing routines) as parameters. It inserts
the form into the instance, defines all object names and arranges that
the callback methods are called. All the names inserted into the
instance are the same as the names used for the objects, etc. in the
fd file.
.LP
.ft C
merge_full_form(instance, form, ftuple)
.IP
This function does the same as create_full_form, only it does not create
the form itself nor the 'background box' that fdesign automatically
adds to each form. This is useful if your class inherits a superclass
that already defines a skeleton form (with 'OK' and 'Cancel' buttons,
for instance), and you want to merge the new form into that existing
form. The 'form' parameter is the form to which the new objects are
added.
.LP
If you use the paradigm sketched here but need slightly more control
over object creation there is a routine that creates a single object
and inserts its name (and arranges for the callback routine to be
called):
.LP
.ft C
create_object_instance(instance, form, obj_template)
