/*
	Copyright (c) 2024 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/


/*--------------------------------------------------------------------*\
Pro/Toolkit includes -- include this first
\*--------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProMenu.h>

/*--------------------------------------------------------------------*\
Application macros
\*--------------------------------------------------------------------*/
#include "UtilString.h"
#include "TestError.h"
#include "TestMfgNew.h"
#include "UtilCollect.h"
/*--------------------------------------------------------------------*\
Application data types
\*--------------------------------------------------------------------*/

/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
#include "MfgMenu.h"

int ProTestTkClcmdsAct (ProAppData data, int dummy);

/*====================================================================*\
FUNCTION : ProTestMfgNew()
PURPOSE  : Top level menu for new manufacturing functions.
\*====================================================================*/
int ProTestMfgNew()
{
  ProMdl model;
  ProError status;
  static char *menu[] = {"TkMfgNew","TkMfgAct","TkMfgDQ",""};
  MfgMenuChoice obj_action;
  MfgObjList    *mfgobj_list;
  int id;

  int ProTestChooseMfgAction();
  int ProTestExecMfgAction();
  int user_exit_from_process();
  int ProTestCollection();

        /* Get mfg. model. */
    ProMdlCurrentGet(&model);

        /* Init valuse to 0/NULL. */
    mfgobj_list = (MfgObjList *)calloc(1,sizeof(MfgObjList));

        /* Test which mfg. objects are defined. */
    ProTestMfgObjectsCollect(model, mfgobj_list);


        /* Set initial state of the menu. */
    obj_action.mfgobj_type   = MFGOBJ_WKCELL;
    obj_action.mfgobj_action = MFGACT_CREATE;
    obj_action.mfgobj_list   = mfgobj_list;

     status = ProMenuPush();
     TEST_CALL_REPORT ("ProMenuPush", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);

     status = ProMenuFileRegister((char*)"TkMfgNew",(char*)"tkmfgnew.mnu", &id);
     TEST_CALL_REPORT ("ProMenuFileRegister", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);

     status = ProMenubuttonActionSet((char*)"TkMfgNew",(char*)"TkMfgNew", (ProMenubuttonAction)ProMenuHold,NULL,0);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);

     status = ProMenubuttonActionSet((char*)"TkMfgNew",(char*)"-Workcell",
                        (ProMenubuttonAction)ProTestChooseMfgAction, &obj_action, MFGOBJ_WKCELL);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgNew",(char*)"-Fixture",
                        (ProMenubuttonAction)ProTestChooseMfgAction, &obj_action, MFGOBJ_FIXTURE);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgNew",(char*)"-Operation",
                        (ProMenubuttonAction)ProTestChooseMfgAction, &obj_action, MFGOBJ_OPER);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgNew",(char*)"-NC Sequence",
                        (ProMenubuttonAction)ProTestChooseMfgAction, &obj_action, MFGOBJ_NC_SEQ);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgNew",(char*)"-Tool",
                        (ProMenubuttonAction)ProTestChooseMfgAction, &obj_action, MFGOBJ_TOOL);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgNew",(char*)"-Collection",
                        (ProMenubuttonAction)ProTestCollection, &model, 0 );
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     
         status = ProMenubuttonActionSet((char*)"TkMfgNew",(char*)"-CLcmds",
                        (ProMenubuttonAction)ProTestTkClcmdsAct, &model, 0 );
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR)
     
     status = ProMenuDatamodeSet((char*)"TkMfgNew", (ProBoolean)0);
     TEST_CALL_REPORT ("ProMenuDatamodeSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);

     status = ProMenuFileRegister((char*)"TkMfgAct",(char*)"tkmfgact.mnu", &id);
     TEST_CALL_REPORT ("ProMenuPush", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);

     status = ProMenubuttonActionSet((char*)"TkMfgAct",(char*)"TkMfgAct", (ProMenubuttonAction)ProMenuHold,NULL,0);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgAct",(char*)"-Create",
                        (ProMenubuttonAction)ProTestChooseMfgAction, &obj_action, MFGACT_CREATE);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgAct",(char*)"-Redefine",
                        (ProMenubuttonAction)ProTestChooseMfgAction, &obj_action, MFGACT_REDEFINE);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgAct",(char*)"-Display",
                        (ProMenubuttonAction)ProTestChooseMfgAction, &obj_action, MFGACT_DISPLAY);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgAct",(char*)"-Route",
                        (ProMenubuttonAction)ProTestChooseMfgAction, &obj_action, MFGACT_ROUTE);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenuDatamodeSet((char*)"TkMfgAct", (ProBoolean)0);
     TEST_CALL_REPORT ("ProMenuDatamodeSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);

     status = ProMenuFileRegister((char*)"TkMfgDQ",(char*)"tkmfgdq.mnu", &id);
     TEST_CALL_REPORT ("ProMenuFileRegister", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);

     status = ProMenubuttonActionSet((char*)"TkMfgDQ",(char*)"TkMfgDQ", (ProMenubuttonAction)ProMenuHold,NULL,0);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgDQ",(char*)"Done", (ProMenubuttonAction)ProTestExecMfgAction, &obj_action,0);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonActionSet((char*)"TkMfgDQ",(char*)"Quit", (ProMenubuttonAction)user_exit_from_process,NULL,0);
     TEST_CALL_REPORT ("ProMenubuttonActionSet", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProCompoundmenuCreate(menu, &id);
     TEST_CALL_REPORT ("ProCompoundmenuCreate", "ProTestMfgNew", status,
         status != PRO_TK_NO_ERROR);
     status = ProMenubuttonHighlight((char*)"TkMfgNew",(char*)"-Workcell");
     TEST_CALL_REPORT ("ProMenubuttonHighlight", 
		"ProTestMfgNew",
	        status, status != PRO_TK_NO_ERROR);
     status = ProMenubuttonHighlight((char*)"TkMfgAct",(char*)"-Create");
     TEST_CALL_REPORT ("ProMenubuttonHighlight", 
		"ProTestMfgNew",
	        status, status != PRO_TK_NO_ERROR);
            
     if(mfgobj_list->n_wcell <= 0)
     {
         status = ProMenubuttonDeactivate((char*)"TkMfgNew",(char*)"-Operation");     
         TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
		"ProTestMfgNew",
	        status, status != PRO_TK_NO_ERROR);
     }
     if(mfgobj_list->n_oper <= 0)
     {
         status = ProMenubuttonDeactivate((char*)"TkMfgNew",(char*)"-NC Sequence");     
         TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
		"ProTestMfgNew",
	        status, status != PRO_TK_NO_ERROR);
     }

     if(mfgobj_list->n_wcell <= 0)
     {
         status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Display");     
         TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
		"ProTestMfgNew",
	        status, status != PRO_TK_NO_ERROR);
     }
     status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Route");     
     TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
		"ProTestMfgNew",
	        status, status != PRO_TK_NO_ERROR);

     status = ProMenuProcess(menu[0], &id);
     TEST_CALL_REPORT ("ProMenuProcess", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
     status = ProMenuPop();
     TEST_CALL_REPORT ("ProMenuPop", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);

     return(0);
}



/*====================================================================*\
    FUNCTION :  ProTestMfgObjectsCollect()
    PURPOSE  :  Collects the array of Mfg. objects using Visit func.
\*====================================================================*/
ProError ProTestMfgObjectsCollect(
    ProMdl model,
    MfgObjList *mfgobj_list)
{
  ProSolid      mfg_wkpc = NULL;
  ProAssembly   mfg_asm = NULL;
  ProError status;
  ProFeature *features;
  int features_num, i;
  ProTool *tools;
  int tools_num;
  ProMfgType mfg_type;
  

  ProError ProTestMfgFeatVisitAction(ProFeature *feature, ProError filt_status,
                                    ProAppData app_data);
  ProError ProTestMfgToolVisitAction(PRO_CONST_ARG ProTool* tool, 
                                                   ProAppData app_data);


      /* Free memory if already alocated. */
    if(mfgobj_list->wcell != NULL)
    {
        status = ProArrayFree( (ProArray*)&(mfgobj_list->wcell) );
        mfgobj_list->n_wcell = 0;
    }
    if(mfgobj_list->fixture != NULL)
    {
        status = ProArrayFree( (ProArray*)&(mfgobj_list->wcell) );
        mfgobj_list->n_fixture = 0;
    }
    if(mfgobj_list->oper != NULL)
    {
        status = ProArrayFree( (ProArray*)&(mfgobj_list->wcell) );
        mfgobj_list->n_oper = 0;
    }
    if(mfgobj_list->nc_seq != NULL)
    {
        status = ProArrayFree( (ProArray*)&(mfgobj_list->wcell) );
        mfgobj_list->n_nc_seq = 0;
    }


    status = ProArrayAlloc(0, sizeof(ProWcell), 1,
                                    (ProArray*)&(mfgobj_list->wcell));
    status = ProArrayAlloc(0, sizeof(ProFixture), 1,
                                    (ProArray*)&(mfgobj_list->fixture));
    status = ProArrayAlloc(0, sizeof(ProMfgoper), 1,
                                    (ProArray*)&(mfgobj_list->oper));
    status = ProArrayAlloc(0, sizeof(ProNcseq), 1,
                                    (ProArray*)&(mfgobj_list->nc_seq));

    status = ProMfgSolidGet((ProMfg)model, &mfg_wkpc);
    TEST_CALL_REPORT("ProMfgSolidGet()", "ProTestMfgObjectsCollect",
                                       status, status!=PRO_TK_NO_ERROR);
                                          
    status = ProUtilCollectSolidFeatures (mfg_wkpc, &features);
    if (status == PRO_TK_NO_ERROR)
    {
        status = ProArraySizeGet ((ProArray)features, &features_num);
        TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestMfgObjectsCollect()", 
            status, status != PRO_TK_NO_ERROR );
        for (i = 0; i < features_num; i++)
        {
            status = ProTestMfgFeatVisitAction (&features[i],
                PRO_TK_NO_ERROR, (ProAppData)mfgobj_list);
        }
        status = ProArrayFree ((ProArray*)&features);
        TEST_CALL_REPORT( "ProArrayFree()", "ProTestMfgObjectsCollect()", 
            status, status != PRO_TK_NO_ERROR );
    }
    
    status = ProMfgAssemGet((ProMfg)model, &mfg_asm);
    TEST_CALL_REPORT("ProMfgAssemGet()", "ProTestMfgObjectsCollect",
                                       status, status!=PRO_TK_NO_ERROR);
    status = ProMfgTypeGet((ProMfg)model, &mfg_type);
    TEST_CALL_REPORT("ProMfgTypeGet()", "ProTestMfgObjectsCollect",
                                       status, status!=PRO_TK_NO_ERROR);
    if (mfg_type == PRO_MFGTYPE_MACH_PART)
    {
	status = ProUtilCollectSolidFeatures (mfg_asm, &features);
	if (status == PRO_TK_NO_ERROR)
	{
	    status = ProArraySizeGet ((ProArray)features, &features_num);
	    TEST_CALL_REPORT( "ProArraySizeGet()", "ProTestMfgObjectsCollect()"
			      ,status, status != PRO_TK_NO_ERROR );
	    for (i = 0; i < features_num; i++)
	    {
		status = ProTestMfgFeatVisitAction (features+i,
	             PRO_TK_NO_ERROR, (ProAppData)mfgobj_list);
	    }
	    status = ProArrayFree ((ProArray*)&features);
	    TEST_CALL_REPORT( "ProArrayFree()", "ProTestMfgObjectsCollect()",
			      status, status != PRO_TK_NO_ERROR );
	}
    }
    
    status = ProArraySizeGet((ProArray*)mfgobj_list->wcell,
                                        &(mfgobj_list->n_wcell));
    TEST_CALL_REPORT("ProArraySizeGet()", "ProTestMfgObjectsCollect",
                                          status, status!=PRO_TK_NO_ERROR);

    status = ProArraySizeGet((ProArray*)mfgobj_list->fixture,
                                        &(mfgobj_list->n_fixture));
    TEST_CALL_REPORT("ProArraySizeGet()", "ProTestMfgObjectsCollect",
                                          status, status!=PRO_TK_NO_ERROR);

    status = ProArraySizeGet((ProArray*)mfgobj_list->oper,
                                        &(mfgobj_list->n_oper));
    TEST_CALL_REPORT("ProArraySizeGet()", "ProTestMfgObjectsCollect",
                                          status, status!=PRO_TK_NO_ERROR);

    status = ProArraySizeGet((ProArray*)mfgobj_list->nc_seq,
                                        &(mfgobj_list->n_nc_seq));
    TEST_CALL_REPORT("ProArraySizeGet()", "ProTestMfgObjectsCollect",
                                          status, status!=PRO_TK_NO_ERROR);

    status = ProArrayAlloc(0, sizeof(ProTool), 1,
                                    (ProArray*)&(mfgobj_list->tool));
    TEST_CALL_REPORT("ProArrayAlloc()", "ProTestMfgObjectsCollect",
                                          status, status!=PRO_TK_NO_ERROR);
    
    status = ProUtilCollectMfgTools ((ProMfg)model, &tools);
    if (status == PRO_TK_NO_ERROR)
    {
        status = ProArraySizeGet ((ProArray)tools, &tools_num);
        TEST_CALL_REPORT( "ProArraySizeGet()", "PProTestMfgObjectsCollect()", 
            status, status != PRO_TK_NO_ERROR );
        for (i = 0; i < tools_num; i++)
        {
            status = ProTestMfgToolVisitAction (tools+i,
	        (ProAppData)mfgobj_list);
        }
        status = ProArrayFree ((ProArray*)&tools);
        TEST_CALL_REPORT( "ProArrayFree()", "ProTestMfgObjectsCollect()", 
            status, status != PRO_TK_NO_ERROR );
    }

    status = ProArraySizeGet((ProArray*)mfgobj_list->tool,
                                        &(mfgobj_list->n_tool));
    TEST_CALL_REPORT("ProArraySizeGet()", "ProTestMfgObjectsCollect",
                                          status, status!=PRO_TK_NO_ERROR);

  return((ProError)0);
}


/*====================================================================*\
    FUNCTION :  ProTestMfgFeatVisitAction()
    PURPOSE  :  Generalized action function for visiting mfg. features.
\*====================================================================*/
ProError ProTestMfgFeatVisitAction(
    ProFeature *feature,
    ProError filt_status,
    ProAppData app_data)
{
  int status;
  ProFeattype type;
  MfgObjList   *mfgobj_list;

    mfgobj_list = (MfgObjList*)app_data;

    status = ProFeatureTypeGet(feature, &type);
    TEST_CALL_REPORT("ProFeatureTypeGet()", "ProTestMfgFeatVisitAction()",
                      (ProError)status, (status != PRO_TK_NO_ERROR));

     switch(type)
     {
	  case PRO_FEAT_WORKCELL:
        status = ProArrayObjectAdd((ProArray*)&(mfgobj_list->wcell), -1, 1, feature);
        TEST_CALL_REPORT("ProArrayObjectAdd()", "ProTestMfgFeatVisitAction()",
                          (ProError)status, status != PRO_TK_NO_ERROR);
	    break;

	  case PRO_FEAT_OPERATION:
        status = ProArrayObjectAdd((ProArray*)&(mfgobj_list->oper), -1, 1, feature);
        TEST_CALL_REPORT("ProArrayObjectAdd()", "ProTestMfgFeatVisitAction()",
                          (ProError)status, status != PRO_TK_NO_ERROR);
	    break;

	  case PRO_FEAT_FIXSETUP:
        status = ProArrayObjectAdd((ProArray*)&(mfgobj_list->fixture), -1, 1, feature);
        TEST_CALL_REPORT("ProArrayObjectAdd()", "ProTestMfgFeatVisitAction()",
                          (ProError)status, status != PRO_TK_NO_ERROR);
	    break;

	  case PRO_FEAT_SAW:
	  case PRO_FEAT_TURN:
	  case PRO_FEAT_MILL:
	  case PRO_FEAT_DRILL:
	 case PRO_FEAT_AUXILIARY:
        status = ProArrayObjectAdd((ProArray*)&(mfgobj_list->nc_seq), -1, 1, feature);
        TEST_CALL_REPORT("ProArrayObjectAdd()", "ProTestMfgFeatVisitAction()",
                          (ProError)status, status != PRO_TK_NO_ERROR);
	    break;

      default:
	       break;
     }

  return(PRO_TK_NO_ERROR);
}


/*====================================================================*\
    FUNCTION :  ProTestMfgToolVisitAction()
    PURPOSE  :  Generalized action function for visiting mfg. objects.
\*====================================================================*/
ProError ProTestMfgToolVisitAction(
    PRO_CONST_ARG ProTool* tool,
    ProAppData app_data)
{
  int status;
  MfgObjList   *mfgobj_list;

    mfgobj_list = (MfgObjList*)app_data;

    status = ProArrayObjectAdd((ProArray*)&(mfgobj_list->tool),
					 	-1, 1, (ProTool *) tool);
    TEST_CALL_REPORT("ProArrayObjectAdd()", "ProTestWcellVisitAction()",
                      (ProError)status, status != PRO_TK_NO_ERROR);

  return(PRO_TK_NO_ERROR);
}



/*====================================================================*\
    FUNCTION :  user_exit_from_process()
    PURPOSE  :  Exits up from mfg. test menu.
\*====================================================================*/
int user_exit_from_process()
{
     ProError status;
     status = ProMenuDelete();
     TEST_CALL_REPORT ("ProMenudelete", 
                   "user_exit_from_process",
	           status, status != PRO_TK_NO_ERROR);
     status = ProMenuDelete();
     TEST_CALL_REPORT ("ProMenudelete", 
                   "user_exit_from_process",
	           status, status != PRO_TK_NO_ERROR);
     status = ProMenuDelete();
     TEST_CALL_REPORT ("ProMenudelete", 
                   "user_exit_from_process",
	           status, status != PRO_TK_NO_ERROR);

     return(0);
}



/*====================================================================*\
    FUNCTION : ProTestMfgActionMenuSet
    PURPOSE  : Set menus based on selection and exsisting mfg. objects.
\*====================================================================*/
int ProTestMfgActionMenuSet(MfgMenuChoice *obj_action)
{
     ProError status;
        /* Set mfg. menu display type. */
     switch(obj_action->mfgobj_action)
     {
	  case MFGACT_CREATE:
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Redefine");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Display");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Route");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonHighlight((char*)"TkMfgAct",(char*)"-Create");
            TEST_CALL_REPORT ("ProMenubuttonHighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);  
	    break;

	  case MFGACT_REDEFINE:
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Create");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Display");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Route");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonHighlight((char*)"TkMfgAct",(char*)"-Redefine");
	    TEST_CALL_REPORT ("ProMenubuttonHighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
	    break;

	  case MFGACT_DISPLAY:
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Create");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Redefine");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Route");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            ProMenubuttonHighlight((char*)"TkMfgAct",(char*)"-Display");
	    TEST_CALL_REPORT ("ProMenubuttonHighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
	    break;

	  case MFGACT_ROUTE:
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Create");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Redefine");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgAct",(char*)"-Display");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonHighlight((char*)"TkMfgAct",(char*)"-Route");
	    TEST_CALL_REPORT ("ProMenubuttonHighlight", "ProTestMfgActionMenuSet", status,
	        status != PRO_TK_NO_ERROR);
	    break;

      default:
	       break;
     }

  return(0);
}


/*====================================================================*\
    FUNCTION : ProTestMfgTypeMenuSet
    PURPOSE  : Set menus based on selection and exsisting mfg. objects.
\*====================================================================*/
int ProTestMfgTypeMenuSet(MfgMenuChoice *obj_action)
{
     ProError status;
        /* Set mfg. menu display type. */
     switch(obj_action->mfgobj_type)
     {
	  case MFGOBJ_WKCELL:
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Fixture");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Operation");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-NC Sequence");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Tool");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);

            status = ProMenubuttonHighlight((char*)"TkMfgNew",(char*)"-Workcell");
            TEST_CALL_REPORT ("ProMenubuttonHighlight", 
		"ProTestMfTypeMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            
            if(obj_action->mfgobj_list->n_wcell <= 0)
            {
                status = ProMenubuttonDeactivate((char*)"TkMfgNew",(char*)"-Operation");     
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
            if(obj_action->mfgobj_list->n_oper <= 0)
            {
                status = ProMenubuttonDeactivate((char*)"TkMfgNew",(char*)"-NC Sequence");
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
            status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Display");
            TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Route");     
            TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
	    break;

	  case MFGOBJ_FIXTURE:
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Workcell");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Operation");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-NC Sequence");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Tool");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);

            status = ProMenubuttonHighlight((char*)"TkMfgNew",(char*)"-Fixture");
            TEST_CALL_REPORT ("ProMenubuttonHighlight", 
		"ProTestMfTypeMenuSet",
	        status, status != PRO_TK_NO_ERROR);

            if(obj_action->mfgobj_list->n_wcell <= 0)
            {
                status = ProMenubuttonDeactivate((char*)"TkMfgNew",(char*)"-Operation");     
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
            if(obj_action->mfgobj_list->n_oper <= 0)
            {
                status = ProMenubuttonDeactivate((char*)"TkMfgNew",(char*)"-NC Sequence");    
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
	    if(obj_action->mfgobj_list->n_fixture <= 0)
              {
                status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Display");     
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
                status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Redefine");
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
              }
            else
              {
                status = ProMenubuttonActivate((char*)"TkMfgAct",(char*)"-Display"); 
        	TEST_CALL_REPORT ("ProMenubuttonActivate", 
	           "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
                status = ProMenubuttonActivate((char*)"TkMfgAct",(char*)"-Redefine");
        	TEST_CALL_REPORT ("ProMenubuttonActivate", 
	           "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
              }

            status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Route");     
            TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
	    break;

	  case MFGOBJ_OPER:
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Workcell");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Fixture");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-NC Sequence");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Tool");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);

            status = ProMenubuttonHighlight((char*)"TkMfgNew",(char*)"-Operation");
            TEST_CALL_REPORT ("ProMenubuttonHighlight", 
		"ProTestMfTypeMenuSet",
	        status, status != PRO_TK_NO_ERROR);

            if(obj_action->mfgobj_list->n_oper <= 0)
            {
                status = ProMenubuttonDeactivate((char*)"TkMfgNew",(char*)"-NC Sequence");
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
            else
            {
                status = ProMenubuttonActivate((char*)"TkMfgNew",(char*)"-NC Sequence");
        	TEST_CALL_REPORT ("ProMenubuttonActivate", 
	           "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
            status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Route");
            TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);

            if(obj_action->mfgobj_list->n_nc_seq <= 0)
            {
                status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Display");
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
            else
            {
                status = ProMenubuttonActivate((char*)"TkMfgAct",(char*)"-Display");     
        	TEST_CALL_REPORT ("ProMenubuttonActivate", 
	           "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
	    break;

	  case MFGOBJ_NC_SEQ:
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Workcell");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Fixture");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Operation");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Tool");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonHighlight((char*)"TkMfgNew",(char*)"-NC Sequence");
            TEST_CALL_REPORT ("ProMenubuttonHighlight", 
		"ProTestMfTypeMenuSet",
	        status, status != PRO_TK_NO_ERROR);

            if(obj_action->mfgobj_list->n_nc_seq <= 0)
            {
                status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Display");
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
                status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Route");
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
            else
            {
                status = ProMenubuttonActivate((char*)"TkMfgAct",(char*)"-Display");     
        	TEST_CALL_REPORT ("ProMenubuttonActivate", 
	           "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
                status = ProMenubuttonActivate((char*)"TkMfgAct",(char*)"-Route");     
        	TEST_CALL_REPORT ("ProMenubuttonActivate", 
	           "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
	    break;

	  case MFGOBJ_TOOL:
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Workcell");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Fixture");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-Operation");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);
            status = ProMenubuttonUnhighlight((char*)"TkMfgNew",(char*)"-NC Sequence");
	    TEST_CALL_REPORT ("ProMenubuttonUnhighlight", 
		"ProTestMfgActionMenuSet",
	        status, status != PRO_TK_NO_ERROR);

            status = ProMenubuttonHighlight((char*)"TkMfgNew",(char*)"-Tool");
            TEST_CALL_REPORT ("ProMenubuttonHighlight", 
		"ProTestMfTypeMenuSet",
	        status, status != PRO_TK_NO_ERROR);

            if(obj_action->mfgobj_list->n_wcell <= 0)
            {
                status = ProMenubuttonDeactivate((char*)"TkMfgNew",(char*)"-Operation");     
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
            if(obj_action->mfgobj_list->n_oper <= 0)
            {
                status = ProMenubuttonDeactivate((char*)"TkMfgNew",(char*)"-NC Sequence");
                TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }

            status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Display");     
            TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
	           
/*          Added tool redefine */
/*            status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Redefine");
            TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);*/
      
            if(obj_action->mfgobj_list->n_tool<=0) 
            {
              status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Route");
              TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
	      status = ProMenubuttonDeactivate((char*)"TkMfgAct",(char*)"-Redefine");
              TEST_CALL_REPORT ("ProMenubuttonDeactivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
            else
            {
              status = ProMenubuttonActivate((char*)"TkMfgAct",(char*)"-Route");
       	      TEST_CALL_REPORT ("ProMenubuttonactivate", 
		"ProTestMfgTypeMenuSet",
	        status, status != PRO_TK_NO_ERROR);
	      status = ProMenubuttonActivate((char*)"TkMfgAct",(char*)"-Redefine");
              TEST_CALL_REPORT ("ProMenubuttonActivate", 
                   "ProTestMfgTypeMenuSet",
	           status, status != PRO_TK_NO_ERROR);
            }
	    break;

      default:
	break;
     }

   return(0);
}


/*====================================================================*\
    FUNCTION : ProTestChooseMfgAction
    PURPOSE  : Chose action for an mfg. object.
\*====================================================================*/
int ProTestChooseMfgAction(MfgMenuChoice *obj_action, int opt)
{

     switch(opt)
     {
        /* Set mfg. object type. */
	  case MFGOBJ_WKCELL:
            obj_action->mfgobj_type = MFGOBJ_WKCELL;
	    break;

	  case MFGOBJ_FIXTURE:
            obj_action->mfgobj_type = MFGOBJ_FIXTURE;
	    break;

	  case MFGOBJ_OPER:
            obj_action->mfgobj_type = MFGOBJ_OPER;
	    break;

	  case MFGOBJ_NC_SEQ:
            obj_action->mfgobj_type = MFGOBJ_NC_SEQ;
	    break;

	  case MFGOBJ_TOOL:
            obj_action->mfgobj_type = MFGOBJ_TOOL;
	    break;


        /* Set mfg. action. */
	  case MFGACT_CREATE:
            obj_action->mfgobj_action = MFGACT_CREATE;
	    break;

	  case MFGACT_REDEFINE:
            obj_action->mfgobj_action = MFGACT_REDEFINE;
	    break;

	  case MFGACT_DISPLAY:
            obj_action->mfgobj_action = MFGACT_DISPLAY;
	    break;

	  case MFGACT_ROUTE:
            obj_action->mfgobj_action = MFGACT_ROUTE;
	    break;

      default:
	       break;
     }

    ProTestMfgTypeMenuSet(obj_action);
    ProTestMfgActionMenuSet(obj_action);

  return(0);
}

/*====================================================================*\
FUNCTION : ProTestWkcellAction
PURPOSE  : ProTestWkcellAction
\*====================================================================*/
int ProTestWkcellAction(MfgMenuChoice *obj_action)
{

     switch(obj_action->mfgobj_action)
     {
     case MFGACT_CREATE:
        ProTestWkcellCreate(obj_action);
        break;
     case MFGACT_REDEFINE:
        ProTestWkcellRedefine(obj_action);
        break;

     case MFGACT_DISPLAY:
        break;

     case MFGACT_ROUTE:
        break;

     default:
        break;
     }

  return(0);
}

/*====================================================================*\
FUNCTION : ProTestFixtureAction
PURPOSE  : ProTestFixtureAction
\*====================================================================*/
int ProTestFixtureAction(MfgMenuChoice *obj_action)
{
  ProError status;

     switch(obj_action->mfgobj_action)
     {
     case MFGACT_CREATE:
        ProTestFixtureCreate(obj_action);
        break;

     case MFGACT_REDEFINE:
	status = (ProError)ProTestFixtList( obj_action );
        break;

     case MFGACT_DISPLAY:
        status = ProTestFixtureDisp( obj_action );
        break;

     case MFGACT_ROUTE:
        break;

     default:
        break;
     }

  return(0);
}


/*====================================================================*\
FUNCTION : ProTestOperationAction
PURPOSE  : ProTestOperationAction
\*====================================================================*/
int ProTestOperationAction(MfgMenuChoice *obj_action)
{
     switch(obj_action->mfgobj_action)
     {
     case MFGACT_CREATE:
        ProTestOperationCreate(obj_action);
        break;

     case MFGACT_REDEFINE:
        break;

     case MFGACT_DISPLAY:
        ProTestOperationDisplay( obj_action );
        break;

     case MFGACT_ROUTE:
        break;

     default:
        break;
     }

  return(0);
}


/*====================================================================*\
FUNCTION : ProTestNcseqAction
PURPOSE  : ProTestNcseqAction
\*====================================================================*/
int ProTestNcseqAction(MfgMenuChoice *obj_action)
{
  ProError status;

     switch(obj_action->mfgobj_action)
     {
     case MFGACT_CREATE:
        status = ProTestNCSequenceCreate(obj_action);
        break;

     case MFGACT_REDEFINE:
        break;

     case MFGACT_DISPLAY:
        status = ProTestNcseqToolPathDisplay();
        break;

     default:
        break;
     }

  return(0);
}

/*====================================================================*\
FUNCTION : ProTestToolAction
PURPOSE  : ProTestToolAction
\*====================================================================*/
int ProTestToolAction(MfgMenuChoice *obj_action)
{
  ProError status;

     switch(obj_action->mfgobj_action)
     {
     case MFGACT_CREATE:
        status = ProTestCreateTool(obj_action);
        break;

     case MFGACT_REDEFINE:
        status = ProTestToolRedefine (obj_action);
        break;

     case MFGACT_DISPLAY:
        break;

     case MFGACT_ROUTE:
        status = ProTestRouteTool();
        break;

     default:
        break;
     }

  return(0);
}

/*====================================================================*\
FUNCTION : ProTestExecMfgAction
PURPOSE  : ProTestExecMfgAction
\*====================================================================*/
int ProTestExecMfgAction(MfgMenuChoice *obj_action, int opt)
{
  ProMdl model;

        /* Get mfg. model. */
    ProMdlCurrentGet(&model);

     switch(obj_action->mfgobj_type)
     {
     case MFGOBJ_WKCELL:
        ProTestWkcellAction(obj_action);
	break;

     case MFGOBJ_FIXTURE:
        ProTestFixtureAction(obj_action);
        break;

     case MFGOBJ_OPER:
        ProTestOperationAction(obj_action);
        break;

     case MFGOBJ_NC_SEQ:
        ProTestNcseqAction(obj_action);
        break;

     case MFGOBJ_TOOL:
        ProTestToolAction(obj_action);
        break;

     default:
        break;
     }

  return(0);
}