#ifndef PROVALUEH
#define PROVALUEH

#include <ProToolkit.h>
#include <ProWchar.h>
#include <ProSelection.h>




PRO_BEGIN_C_DECLS

typedef enum pro_value_data_type
{
  PRO_VALUE_TYPE_INT           = 1,
  PRO_VALUE_TYPE_DOUBLE,
  PRO_VALUE_TYPE_POINTER,
  PRO_VALUE_TYPE_STRING,
  PRO_VALUE_TYPE_WSTRING,
  PRO_VALUE_TYPE_SELECTION,
  PRO_VALUE_TYPE_TRANSFORM,
  PRO_VALUE_TYPE_BOOLEAN
} ProValueDataType;

typedef struct pro_value_data
{
  ProValueDataType   type;
  union
  {
    int            i;   /* integer */
    double         d;   /* double  */
    void          *p;   /* pointer or reference */
    char          *s;   /* string  */
    wchar_t       *w;   /* wide string */
    ProSelection   r;   /* selection */
    double       **t;   /* transform a matrix of 4x4 */
    ProBoolean     b;	/* boolean */
  } v;
} ProValueData;
 

LIB_COREUTILS_API  ProError ProValuedataStringSet( ProValueData* value, char* string );
/*
    Purpose: Stores a string in a ProValueData.

    Input Arguments:
        value - the ProValueData to store in.
        string - the string to store.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The storage succeeded.
        PRO_TK_GENERAL_ERROR - The storage failed.

*/

LIB_COREUTILS_API  ProError ProValuedataWstringSet( ProValueData* value,
					wchar_t* wstring );
/*
    Purpose: Stores a widestring in a ProValueData.

    Input Arguments:
        value - the ProValueData to store in.
        wstring - the widestring to store.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The storage succeeded.
        PRO_TK_GENERAL_ERROR - The storage failed.

*/

LIB_COREUTILS_API  ProError ProValuedataTransformSet( ProValueData* value,
					  ProMatrix transform );
/*
    Purpose: Stores a transform in a ProValueData.

    Input Arguments:
        value - the ProValueData to store in.
        transform - the transform to store.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The storage succeeded.
        PRO_TK_GENERAL_ERROR - The storage failed.

*/

LIB_COREUTILS_API  ProError ProValuedataTransformGet( ProValueData* value,
					  ProMatrix transform );
/*
    Purpose: Extracts a transform from a ProValueData.

    Input Arguments:
        value - the ProValueData to extract from

    Output Arguments:
        transform - the ProMatrix to extract into.

    Return Values:
        PRO_TK_NO_ERROR - The extraction succeeded.
        PRO_TK_BAD_INPUTS - The ProValueData did not contain a transform
        PRO_TK_GENERAL_ERROR - The storage failed.

*/

/*
MECHANISM FOR SETTING THE VALUE OF ProArgument ARRAYS:
  ProArgument* args;
  ProArrayAlloc( #, sizeof(ProArgument), #, (ProArray*)&args );
	(use SizeSet if expansion necessary)

	this is example for string; wstring & transform parallel
  ProValuedataStringSet( &(args[#].value), char* );
OR
  ProArgument arg;
  ProArgument* args;
  ProArrayAlloc( 0, sizeof(ProArgument), 1, (ProArray*)&args );
  ProValuedataStringSet( &arg, char* );
  ProArrayObjectAdd( &args, 1, 0, &arg );
*/

typedef struct Pro_Value *ProValue;

/*----------------------- functions ---------------------------*/

extern ProError ProValueAlloc( ProValue *p_value );
/*
    Purpose: 
             <P><B>Note: </B>From release Wildfire 2.0 this function is 
             superseded by the functions: 
             <UL> 
             <LI>ProElementValuetypeGet() 
             <LI>ProElementReferenceSet() 
             <LI>ProElementIntegerSet() 
             <LI>ProElementDoubleSet() 
             <LI>ProElementStringSet() 
             <LI>ProElementWstringSet() 
             <LI>ProElementBooleanSet() 
             <LI>ProElementTransformSet() 
             <LI>ProElementSpecialvalueSet() 
             <LI>ProElementCollectionSet() 
             </UL> PTC recommends using the new functions in place of this 
             function in all new or updated user applications. 
             <P>Allocates the memory for the <i>ProValue</i>.

    Input Arguments:
        none

    Output Arguments:
        p_value - The address of the <i>ProValue</i> object

    Return Values:
        PRO_TK_NO_ERROR - The function successfully allocated a <i>ProValue</i> 
                          object.

*/

extern ProError ProValueFree( ProValue value );
/*
    Purpose: 
             <P><B>Note: </B>From release Wildfire 2.0 this function is 
             superseded by the functions: 
             <UL> 
             <LI>ProElementValuetypeGet() 
             <LI>ProElementReferenceGet() 
             <LI>ProElementIntegerGet() 
             <LI>ProElementDoubleGet() 
             <LI>ProElementStringGet() 
             <LI>ProElementWstringGet() 
             <LI>ProElementBooleanGet() 
             <LI>ProElementTransformGet() 
             <LI>ProElementSpecialvalueGet() 
             <LI>ProElementCollectionGet() 
             </UL> PTC recommends using the new functions in place of this 
             function in all new or updated user applications. 
             <P>Frees memory allocated by <b>ProValueAlloc()</b>. This function 
             should not be used to free the value of a PRO_E_SKETCHER element.

    Input Arguments:
        value - The handle to a <i>ProValue</i>(allocated by 
                <b>ProValueAlloc()</b>)

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully freed the memory.
        PRO_TK_BAD_INPUTS - The argument is invalid.

    See Also:
        ProValueAlloc()
*/



extern ProError ProValueDataGet( ProValue       value,
                                 ProValueData  *value_data );
/*
    Purpose: 
             <P><B>Note: </B>From release Wildfire 2.0 this function is 
             superseded by the functions: 
             <UL> 
             <LI>ProElementValuetypeGet() 
             <LI>ProElementReferenceGet() 
             <LI>ProElementIntegerGet() 
             <LI>ProElementDoubleGet() 
             <LI>ProElementStringGet() 
             <LI>ProElementWstringGet() 
             <LI>ProElementBooleanGet() 
             <LI>ProElementTransformGet() 
             <LI>ProElementSpecialvalueGet() 
             <LI>ProElementCollectionGet() 
             </UL> PTC recommends using the new functions in place of this 
             function in all new or updated user applications. 
             <P>Retrieves the data of the value, and fills the user-visible 
             <i>ProValueData</i> structure.

    Input Arguments:
        value - The value object

    Output Arguments:
        value_data - The data in the value

    Return Values:
        PRO_TK_NO_ERROR - The function successfully filled in the data for the 
                          value.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProValueDataSet( ProValue       value,
                                 ProValueData  *value_data );
/*
    Purpose: 
             <P><B>Note: </B>From release Wildfire 2.0 this function is 
             superseded by the functions: 
             <UL> 
             <LI>ProElementValuetypeGet() 
             <LI>ProElementReferenceSet() 
             <LI>ProElementIntegerSet() 
             <LI>ProElementDoubleSet() 
             <LI>ProElementStringSet() 
             <LI>ProElementWstringSet() 
             <LI>ProElementBooleanSet() 
             <LI>ProElementTransformSet() 
             <LI>ProElementSpecialvalueSet() 
             <LI>ProElementCollectionSet() 
             </UL> PTC recommends using the new functions in place of this 
             function in all new or updated user applications. 
             <P>Sets the data of the value from the <i>ProValueData</i> 
             supplied.

    Input Arguments:
        value - The value object
        value_data - The data to be assigned

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the data.
        PRO_TK_BAD_INPUTS - One or more of the arguments are invalid.

*/



extern ProError ProWstringArrayToValueArray( ProLine   *wstring_array,
                                             int        n_lines,
                                             ProValue **p_value_array );
/*
    Purpose: Converts an array of strings to an array of <i>ProValues</i>.

    Input Arguments:
        wstring_array - The input array of strings.
        n_lines - The number of lines.

    Output Arguments:
        p_value_array - The array of <i>ProValues</i>. The function allocates 
                        the memory for this argument. Use the function 
                        <b>ProArrayFree()</b> to free the memory.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully converted the array of 
                          strings to an array of values.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

    See Also:
        ProArrayFree()
*/


extern ProError ProValueArrayToWstringArray( ProValue  *value_array,
                                             int        n_values,
                                             wchar_t ***p_wstring_array );
/*
    Purpose: Extracts the data from an array of <i>ProValues</i> that contains 
             wide-character strings into an array of wide-character strings.

    Input Arguments:
        value_array - An array of values.
        n_values - The number of values in the array.

    Output Arguments:
        p_wstring_array - An array of wide-character strings. The function 
                          allocates the memory for this array. Use the function 
                          <b>ProArrayFree()</b> to free the memory.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully converted the array of 
                          <i>ProValues</i> to an array of strings.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.

    See Also:
        ProArrayFree()
*/



PRO_END_C_DECLS

#endif /* PROVALUEH */