#ifndef PROSELECTION_H 
#define PROSELECTION_H

/* 
   Creo Parametric TOOLKIT declarations for ProSelection, ProSellist and 
   ProCompPath related actions
*/

#include <ProObjects.h>
#include <ProView.h>
#include <ProAsmcomppath.h>



PRO_BEGIN_C_DECLS

/* this is an opaque handle, which the user should not dereference */
typedef struct select3d *ProSelection;

typedef ProError (*ProSelectionPreFilter) ( ProSelection selection,
					    Pro3dPnt     point,
					    ProMatrix    transform,
					    char        *option,
					    int          level,
					    ProAppData   app_data );
/*
    Purpose: This is the user-defined, pre-filter function. Every selection 
             candidate will be called.

    Input Arguments:
        selection - The selection handle.
        point - The selected point in screen coords.
        transform - The current view matrix.
        option - Tells how far through the Creo Parametric selection process to 
                 go. The value is the same as is passed to <b>ProSelect()</b> 
                 with the addition to a view, part, or assembly.
        level - The current depth of the assembly hierarchy.
        app_data - The user data passed to <b>ProSelect()</b>.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Accept the selection.
        Other - Ignore the selection.

*/


typedef ProError (*ProSelectionPostFilter) ( ProSelection selection,
					     ProAppData   app_data) ;
/*
    Purpose: This is the user-defined, post-filter function. Called before 
             being added to the stack for QUERY_SELCT every potential selection 
             is validated by calling the ProSelectionPostFilter.

    Input Arguments:
        selection - The handle to the selection made
        app_data - The user data passed to <b>ProSelect()</b>

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Accept the selection.
        Other - Ignore the selection.

*/
	
typedef ProError (*ProSelectionPostSelact) ( Pro3dPnt     point,
					     ProSelection selection,
					     ProAppData   app_data) ;
/*
    Purpose: This is the user-defined, post-selection callback function. Called 
             on a selection after QUERY_SELECT

    Input Arguments:
        point - The selected point
        selection - The handle to the selection made
        app_data - The user data passed to <b>ProSelect()</b>

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Accept the selection.
        Other - Ignore the selection.

*/

typedef struct pro_sel_functions
{
   ProSelectionPreFilter   pre_filter;
   ProSelectionPostFilter  post_filter;
   ProSelectionPostSelact  post_selact;
   ProAppData              app_data;
} ProSelFunctions;

typedef void (*ProSelectionStartNotify) ( ProAppData   ext_data) ;
/*
    Purpose: Allows applications to make their media ready for ProSelect 
             interaction.This is called once upon entering ProSelect().

    Input Arguments:
        ext_data - The user data passed to <b>ProSelect()</b>

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Accept the selection.
        Other - Ignore the selection.

*/


typedef void (*ProSelectionExtHighlightAct) ( ProSelection selection,
                                              ProBoolean highlight,
                                             ProAppData   ext_data) ;
/*
    Purpose: This is called when an item is selected/unselected and asks 
             external application to highlight/unhighlight an entry in their 
             media corresponding to the passed selection. In case selection is 
             NULL and highlight is PRO_B_FALSE application should clear all 
             highlighting.

    Input Arguments:
        selection - The handle to the selection made
        highlight - The user's choice to highlight/unhighlight
        ext_data - The user data passed to <b>ProSelect()</b>

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Accept the selection.
        Other - Ignore the selection.

*/

					     
typedef void (*ProSelectionEndNotify) ( ProAppData   ext_data) ;
/*
    Purpose: Allows applications to clean their media. Called once upon exiting 
             ProSelect().

    Input Arguments:
        ext_data - The user data passed to <b>ProSelect()</b>

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - Accept the selection.
        Other - Ignore the selection.

*/

typedef struct pro_select_ext_highlight_functions
{
   ProSelectionStartNotify   sel_start;
   ProSelectionExtHighlightAct  highlight;
   ProSelectionEndNotify    sel_end;
   ProAppData              ext_data;
} ProSelectExternalhighlightFunctions;

typedef enum
{
   PRO_SELECT_DONE_REQUIRED    = 50,
   PRO_SELECT_BY_MENU_ALLOWED  = 51,
   PRO_SELECT_BY_BOX_ALLOWED   = 52,
   PRO_SELECT_ACTIVE_COMPONENT_IGNORE   = 53,
   PRO_SELECT_HIDE_SEL_DLG   = 54
} ProSelectionEnvAttr;

typedef struct
{
   ProSelectionEnvAttr   attribute;
   int                   value;
} ProSelectionEnvOption;

typedef enum
{
  PRO_SELECT_OVERRIDE,
  PRO_SELECT_TOGGLE
} ProSelectRecordAction;

typedef void *ProSelAppAction;

typedef struct appl_sel_env* ProSelectionEnv;

extern ProError ProSelectionAlloc( ProAsmcomppath *p_cmp_path,
				   ProModelitem *p_mdl_itm,
				   ProSelection *p_selection );
/*
    Purpose: Allocates and optionally fills in a selection object. 
             <p> The allowed combinations of input arguments are as follows: 
             <table> 
             <tr> <td><b>p_cmp_path</b></td> <td><b>p_mdl_itm</b></td> </tr> 
             <tr> <td>!NULL</td><td>!NULL</td> </tr> 
             <tr> <td>NULL</td><td>!NULL</td> </tr> 
             <tr> <td>NULL</td><td>NULL</td> </tr> </table>

    Input Arguments:
        p_cmp_path - The component path. Can be NULL only in case of parts. 
                     Cannot be NULL in case of assemblies.
        p_mdl_itm - The model item (can be NULL)

    Output Arguments:
        p_selection - The allocated selection object

    Return Values:
        PRO_TK_NO_ERROR - The function successfully allocated the selection.
        PRO_TK_BAD_INPUTS - The allocation failed.

*/


extern ProError ProSelectionCopy( ProSelection  from_selection,
				  ProSelection  *p_to_selection );
/*
    Purpose: Copies a selection object.

    Input Arguments:
        from_selection - The selection object to copy

    Output Arguments:
        p_to_selection - The copied selection object

    Return Values:
        PRO_TK_NO_ERROR - The function successfully copied the selection.
        PRO_TK_BAD_INPUTS - The copy failed.

*/

extern ProError ProSelectionFree( ProSelection *p_selection );
/*
    Purpose: Frees a preallocated selection object.

    Input Arguments:
        p_selection - The address of the selection object

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully freed the selection.
        PRO_TK_BAD_INPUTS - The supplied inputs were incorrect.

*/

extern ProError ProSelectionarrayFree( ProSelection *sel_array );
/*
    Purpose: Frees a ProArray of allocated selection objects (also frees each 
             member ProSelection).

    Input Arguments:
        sel_array - The selection object array.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully freed the selection.
        PRO_TK_BAD_INPUTS - The supplied inputs were incorrect.

*/



extern ProError ProSelectionSet( ProSelection  selection,
				 ProAsmcomppath *p_cmp_path,
				 ProModelitem *p_mdl_itm );
/*
    Purpose: Sets the model item (and optionally a component path) for a 
             selection object.

    Input Arguments:
        selection - The selection object
        p_cmp_path - The component path (can be null)
        p_mdl_itm - The model item

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the component path.
        PRO_TK_BAD_INPUTS - The supplied inputs were incorrect.

*/


extern ProError ProSelectionAsmcomppathGet( ProSelection  selection,
					    ProAsmcomppath *p_cmp_path );
/*
    Purpose: Gets the component path from a selection object.

    Input Arguments:
        selection - The selection object.
        p_cmp_path - The component path. You must allocate the memory for this 
                     structure.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the component 
                          path.
        PRO_TK_BAD_INPUTS - The supplied inputs were incorrect.

*/



extern ProError ProSelectionModelitemGet( ProSelection selection,
					  ProModelitem *p_mdl_item );
/*
    Purpose: Gets the model item from a selection object.

    Input Arguments:
        selection - The selection object.

    Output Arguments:
        p_mdl_item - The model item.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the model item.
        PRO_TK_NOT_EXIST - The model item doesn't exist.
        PRO_TK_BAD_INPUTS - The supplied inputs were incorrect.

*/


extern ProError ProSelectionUvParamSet( ProSelection selection,
					ProUvParam uv_param );
/*
    Purpose: Sets the UV-parameters to a selection object. 
             <p> NOTE: 
             <p> This applies to surface selections only.

    Input Arguments:
        selection - The selection object
        uv_param - The UV-parameters

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the UV-parameters
        PRO_TK_BAD_INPUTS - The supplied inputs were incorrect.

*/

extern ProError ProSelectionUvParamGet( ProSelection selection,
					ProUvParam uv_param );
/*
    Purpose: Gets the UV-parameters from a selection object.

    Input Arguments:
        selection - The selection object
        uv_param - The UV-parameters

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the UV-paramters.
        PRO_TK_BAD_INPUTS - The supplied inputs were incorrect.

*/

extern ProError ProSelectionViewGet( ProSelection selection,
				     ProView* p_view );
/*
    Purpose: Gets the handle to the view from the selection object.

    Input Arguments:
        selection - The selection object

    Output Arguments:
        p_view - The view handle

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The supplied inputs were incorrect.

*/

extern ProError ProSelectionPoint3dGet( ProSelection selection,
					ProPoint3d   point  );
/*
    Purpose: Retrieves the coordinates of the selected point in the member 
             coordinate system.

    Input Arguments:
        selection - The selection object

    Output Arguments:
        point - The point coordinates

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The selection or depth is NULL.
        PRO_TK_INVALID_PTR - The selection argument is an invalid pointer.

*/

extern ProError ProSelectionWindowIdGet( ProSelection selection,
					 int*         window_id  );
/*
    Purpose: Retrieves the window id in which selection was made.

    Input Arguments:
        selection - The selection object

    Output Arguments:
        window_id - The window id

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The selection or depth is NULL.
        PRO_TK_INVALID_PTR - The selection argument is an invalid pointer.

*/

extern ProError ProSelectionDepthGet( ProSelection selection,
				      double*      depth  );
/*
    Purpose: Gets the selection depth, in screen coordinates.

    Input Arguments:
        selection - The selection object

    Output Arguments:
        depth - The selection depth, in screen coordinates

    Return Values:
        PRO_TK_NO_ERROR - The function successfully retrieved the information.
        PRO_TK_BAD_INPUTS - The selection or depth is NULL.
        PRO_TK_INVALID_PTR - The selection argument is an invalid pointer.

*/
 
extern ProError ProSelect( char              option[],
			   int               max_count,
			   ProSelection     *p_in_sel,
			   ProSelFunctions  *sel_func,
			   ProSelectionEnv   sel_env,
			   ProSelAppAction   appl_act_data,
			   ProSelection    **p_sel_array,
			   int              *p_n_sels );
/*
    Purpose: Selects an object in a Creo Parametric window. 
             <p> NOTE: If the user ends the selection without actually making 
             any, ProSelect will return PRO_TK_NO_ERROR with (*p_n_sels) as 
             zero and p_sel_array as NULL. 
             <p>

    Input Arguments:
        option - The selection filter. See the <i>Creo Parametric TOOLKIT 
                 User's Guide</i> for more information.
        max_count - The maximum number of selections allowed.
        p_in_sel - A <i>ProArray</i> of pointers to <i>ProSelection</i> 
                   structures (from a previous call to selection) used to 
                   initialize the array of selections. This can be NULL.
        sel_func - A pointer to a structure of filter functions. This can be 
                   NULL.
        sel_env - Use ProSelectionEnvAlloc() to allocate this argument. Can be 
                  NULL.
        appl_act_data - NULL in Release 18 and higher.

    Output Arguments:
        p_sel_array - A pointer to an array of <i>ProSelection</i> structures. 
                      This argument points to static memory allocated by the 
                      function. It is reallocated on subsequent calls to this 
                      function.
        p_n_sels - The actual number of selections made.

    Return Values:
        PRO_TK_NO_ERROR - The user made a selection, or chose <b>Done</b>.
        PRO_TK_USER_ABORT - The user chose <b>Quit</b>.
        PRO_TK_PICK_ABOVE - Selection was interrupted by a user's pick on any 
                            button from above menus.
        PRO_TK_E_DEADLOCK - The Creo Parametric user interface is not prepared 
                            to handle this request (because it is blocked by 
                            another process such as an OLE container 
                            activation).

    See Also:
        ProSelectionEnvAlloc()
*/


extern ProError ProSelectionVerify( ProSelection selection  );
/*
    Purpose: Verifies the validity of the <i>ProSelection</i>.

    Input Arguments:
        selection - The selection to verify

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully verified the selection.
        PRO_TK_INVALID_TYPE - Selection is invalid.
        PRO_TK_BAD_INPUTS - The verification failed.

*/

extern ProError ProSelectionHighlight( ProSelection selection,
				       ProColortype color );
/*
    Purpose: Highlights the selection in the current window. The selection 
             remains highlighted until you call the function 
             <b>ProSelectionUnhighlight()</b>.

    Input Arguments:
        selection - The selection to highlight
        color - The highlight color

    Output Arguments:
        none

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

*/

extern ProError ProSelectionDisplay( ProSelection selection  );
/*
    Purpose: Displays the selection. Note that this is a one-time action (the 
             next repaint will erase this display).

    Input Arguments:
        selection - The selection to display

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully displayed the selection.
        PRO_TK_BAD_INPUTS - The input argument is invalid.

*/

extern ProError ProSelectionUnhighlight( ProSelection selection  );
/*
    Purpose: Removes the highlighting from the selection, which was highlighted 
             by a previous call to <b>ProSelectionHighlight()</b>.

    Input Arguments:
        selection - The selection from which to remove the highlighting

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully removed the highlighting.
        PRO_TK_BAD_INPUTS - The argument is invalid.

*/

extern ProError ProSelectionEnvAlloc( ProSelectionEnvOption*  sel_env_array,
				      int                     count,
				      ProSelectionEnv*        p_sel_env );
/*
    Purpose: Allocates a <i>ProSelectionEnv</i>, which is a set of attributes 
             that can be passed to <b>ProSelect()</b>.

    Input Arguments:
        sel_env_array - An array of the attributes (the type and value) 
                        assigned to it
        count - The number of items in <i>sel_env_array</i>

    Output Arguments:
        p_sel_env - The handle to the <i>ProSelectionEnv</i>

    Return Values:
        PRO_TK_NO_ERROR - The function successfully allocated the structure.
        PRO_TK_BAD_INPUTS - The specified attributes are invalid.

*/

extern ProError ProSelectionEnvFree( ProSelectionEnv p_sel_env  );
/*
    Purpose: Frees the <i>ProSelectionEnv</i> allocated by 
             <b>ProSelectionEnvAlloc()</b>.

    Input Arguments:
        p_sel_env - A valid handle to the <i>ProSelectionEnv</i>

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully freed the memory.
        PRO_TK_BAD_INPUTS - The argument <i>p_sel_env</i> is NULL.

*/



extern ProError  ProSelectionViewSet( ProView view, 
                                      ProSelection *p_prosel);
/*
    Purpose: Sets the view of the ProSelection to the user provided ProView.

    Input Arguments:
        view - user-provided ProView.
        p_prosel - pointer to user-provided ProSelection.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the view.
        PRO_TK_BAD_INPUTS - One of the arguments is NULL.

*/




extern ProError ProSelectionPoint3dSet( ProPoint3d point, 
                                        ProSelection *p_prosel);
/*
    Purpose: Uses user-provided ProPoint3d to set the selected-point of the 
             ProSelection.

    Input Arguments:
        point - User-provided ProPoint3d.
        p_prosel - Pointer to user-provided ProSelection.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the selected-point of 
                          the ProSelection.
        PRO_TK_BAD_INPUTS - One of the arguments is NULL.

*/
  
                                      
extern ProError ProSelectionDwgtblcellGet(ProSelection selection, 
                                          int *table_segment, 
                                          int *row, 
                                          int *column);
/*
    Purpose: For a ProSelection representing a cell of a drawing table, returns 
             the table segment, row and column of the cell. 
             <p> This function returns row and column indices starting from 
             0.0. Add one to these values to obtain the correct row and column 
             indices for use with other ProDwgtable functions.

    Input Arguments:
        selection - ProSelection representing a cell of a drawing table.

    Output Arguments:
        table_segment - Corresponding table segment, equals sel_elem_id of 
                        selection.
        row - row of table which contains the cell.
        column - column of the table which contains the cell.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully set the selected-point of 
                          the ProSelection.

*/



extern ProError ProSelectionDwgtableGet( ProSelection selection, 
                                         ProDwgtable * table);
/*
    Purpose: For a ProSelection representing a cell of a drawing table, returns 
             the table from which the cell was selected.

    Input Arguments:
        selection - ProSelection representing a cell of a drawing table.

    Output Arguments:
        table - The table from which the cell was selected.

    Return Values:
        PRO_TK_BAD_INPUTS - selection not provided, selection not a table cell, 
                            or ProDwgtable for output not provided.
        PRO_TK_NO_ERROR - Successfully found table corresponding to the table 
                          cell.

*/

extern ProError ProSelectionDrawingGet( ProSelection selection, 
                                        ProDrawing * drawing);
/*
    Purpose: For a ProSelection representing a entities selected in a drawing 
             returns the drawing model handle from which the entities were 
             selected

    Input Arguments:
        selection - ProSelection representing an entity selected in a drawing

    Output Arguments:
        drawing - The drawing model handle from which the selection was made

    Return Values:
        PRO_TK_BAD_INPUTS - invalid inputs
        PRO_TK_E_NOT_FOUND - no associated drawing found
        PRO_TK_NO_ERROR - Successfully in finding the drawing for the selection

*/


extern  ProError  ProSelectionCollectionGet( ProSelection sel,
                                             ProCollection* collection );
/*
    Purpose: Get the ProCollection object from a ProSelection.

    Input Arguments:
        sel - The selection object

    Output Arguments:
        collection - The collection object

    Return Values:
        PRO_TK_NO_ERROR - The function succeeded.
        PRO_TK_BAD_INPUTS - One or more arguments was invalid.
        PRO_TK_INVALID_TYPE - The selection object does not contain a 
                              collection.
        PRO_TK_INVALID_PTR - The selection object contains a chain, but this 
                             chain reference is no longer valid. Chain 
                             references contained in ProSelections are only 
                             valid for as long as the chain is selected in the 
                             selection buffer.

    See Also:
        ProSelbufferCollectionAdd()
*/


extern ProError ProSelectionWithOptionsDistanceEval (
                   ProSelection p_selection1,
                   ProBool option1, 
                   ProSelection p_selection2,
                   ProBool option2,
                   Pro2dPnt param_1,
                   Pro2dPnt param_2,
                   Pro3dPnt pnt_1,
                   Pro3dPnt pnt_2,
                   double *p_result );
/*
    Purpose: Evaluate the distance between two items. Objects can be surfaces, 
             edges, entities, vertices, datums or quilts. The selected points 
             on the objects are used as the initial guesses. In case of error, 
             p_result will be set to -1.0 and all parameters will be set to 
             0.0. option1 and option2 can be specified to alter the desired 
             behavior for the corresponded selection.

    Input Arguments:
        p_selection1 - The first selection.
        option1 - The option related to the first selection. The usage is 
                  analogical to the checkbox in the measure distance UI. For 
                  the PRO_B_TRUE value:
        p_selection2 - The second selection.
        option2 - The option related to the second selection analogical to 
                  option1.

    Output Arguments:
        param_1 - UV parameters of the critical point on the first item. Not 
                  applicable for quilts.
        param_2 - UV parameters of the critical point on the second item. Not 
                  applicable for quilts.
        pnt_1 - Critical point on the first item.
        pnt_2 - Critical point on the second item.
        p_result - The resulting distance between the two items.

    Return Values:
        PRO_TK_NO_ERROR - The function successfully evaluated the distance.
        PRO_TK_OUT_OF_RANGE - The function successfully evaluated the distance, 
                              but UV parameters could not be evaluated. It may 
                              happen when dealing with borderless items and the 
                              calculated critical point is outside of the item 
                              boundaries.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_BAD_CONTEXT - Not applicable to the input selections.

*/

extern ProError  ProSelectExternalselectionRecord (ProSelection selection,  
                                              ProSelectRecordAction  action);
/*
    Purpose: Places external selection into ProSelect() buffer. Together with 
             ProSelectExternalhighlightRegister() provides interaction between 
             external application media like a tree and ProSelect(). Upon an 
             object selection in their media, applications should create 
             ProSelection and use ProSelectExternalselectionRecord to pass it 
             to ProSelect().

    Input Arguments:
        selection - Created by an external application.
        action - PRO_SELECT_OVERRIDE for unmodified selection. 
                 PRO_SELECT_TOGGLE for CTRL modified selection.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully placed selection.
        PRO_TK_BAD_INPUTS - One or more of the input arguments are invalid.
        PRO_TK_INVALID_ITEM - Rejected by ProSelect() filters.

*/

extern ProError ProSelectExternalhighlightRegister (
                                ProSelectExternalhighlightFunctions *show_func);
/*
    Purpose: Register external application highlighting callbacks in order to 
             let application media like a tree react on selections made while 
             ProSelect() is active. Together with 
             ProSelectExternalselectionRecord() provides interaction between 
             external application media and ProSelect().

    Input Arguments:
        show_func - callbacks.

    Output Arguments:
        none

    Return Values:
        PRO_TK_NO_ERROR - The function successfully registered callbacks.
        PRO_TK_GENERAL_ERROR - The function failed to register callbacks.

*/
PRO_END_C_DECLS
#endif /* PROSELECTION_H */