/*
 * This file is part of XForms.
 *
 *  XForms is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU Lesser General Public License as
 *  published by the Free Software Foundation; either version 2.1, or
 *  (at your option) any later version.
 *
 *  XForms is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with XForms.  If not, see <http://www.gnu.org/licenses/>.
 */


/**
 * \file fd_names.c
 *
 *  This file is part of XForms package
 *  Copyright (c) 1996-2002  T.C. Zhao and Mark Overmars
 *  All rights reserved.
 *
 * This file is part of the Form Designer.
 *
 * It contains the routines that keep track of the names and
 * callback routines associated to the different objects.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <string.h>
#include <stdio.h>
#include "fd_main.h"

/****
  THE DATA STRUCTURE
****/

typedef struct
{
    FL_OBJECT * obj;                        /* The object */
    char        name[ MAX_VAR_LEN ];        /* Its name (if any) */
    char        cbname[ MAX_VAR_LEN ];      /* Callback Routine */
    char        argname[ MAX_VAR_LEN ];     /* The argument */
} OBJ;

#define MAXOBJ  1024

static OBJ objects[ MAXOBJ ];   /* The stored objects */
static int objnumb = 0;     /* Their number */


/***************************************
 * Returns the number of the object in the list
 ***************************************/

static int
get_object_numb( const FL_OBJECT * obj )
{
    int i;

    for ( i = 0; i < objnumb; i++ )
        if ( objects[ i ].obj == obj )
            return i;
    return -1;
}


/***************************************
 * Checks whether the names are correct C-names and don't occur already.
 ***************************************/

static void
check_names( int on )
{
    /* Fill in argument if missing */

    if ( *objects[ on ].cbname && ! *objects[ on ].argname)
        strcpy( objects[ on ].argname, "0" );

    /* HAS TO BE EXTENDED */
}


/****
  ACTUAL ROUTINES
****/


/***************************************
 * returns the names of an object
 ***************************************/

void
get_object_name( const FL_OBJECT * obj,
                 char            * name,
                 char            * cbname,
                 char            * argname)
{
    int on = get_object_numb( obj );

    *name = '\0';
    *cbname = '\0';
    *argname = '\0';
    if ( on == -1 )
        return;

    strcpy( name, objects[ on ].name );
    strcpy( cbname, objects[ on ].cbname );
    strcpy( argname, objects[ on ].argname );
}


/***************************************
 * returns the names of an object
 ***************************************/

void
set_object_name( FL_OBJECT  * obj,
                 const char * name,
                 const char * cbname,
                 const char * argname )
{
    int on = get_object_numb( obj );

    if ( obj == NULL )
        return;

    if ( on == -1 )
    {
        if (    ( ! name    || ! *name    )
             && ( ! cbname  || ! *cbname  )
             && ( ! argname || ! *argname ) )
            return;

        if ( objnumb >= MAXOBJ )
            return;

        objects[ objnumb ].obj = obj;
        on = objnumb++;
    }

    if ( name )
        fli_sstrcpy( objects[ on ].name, name, sizeof objects[ on ].name );
    if ( cbname )
        fli_sstrcpy( objects[ on ].cbname, cbname,
                     sizeof objects[ on ].cbname );
    if ( argname )
        fli_sstrcpy( objects[ on ].argname, argname,
                     sizeof objects[ on ].argname  );

    check_names( on );
}


/*
 * Local variables:
 * tab-width: 4
 * indent-tabs-mode: nil
 * End:
 */
