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



/*----------------------------------------------------------------------------*\
Pro/TOOLKIT includes
\*----------------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProMenu.h>
#include <ProMdl.h>
#include <ProArray.h>
#include <ProUtil.h>
#include <ProWindows.h>
#include <ProArray.h>
#include <ProNotify.h>
#include <ProFeatType.h>
#include <ProSolid.h>

/*----------------------------------------------------------------------------*\
C System includes
\*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*\
Application includes
\*----------------------------------------------------------------------------*/
#include "UtilMessage.h"
#include "UtilMenu.h"
#include "PTApplsUnicodeUtils.h"
#include <UtilFiles.h>
#include <UtilVisit.h>
#include <TestError.h>
#include <TestMisc.h>

/*----------------------------------------------------------------------------*\
Application macros
\*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*\
Application prototypes
\*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*\
Application global/external data
\*----------------------------------------------------------------------------*/

    FUNCTION : ProTestMultiCADFile	
    PURPOSE  : Setup menu for testing


ProError ProMultiCADRetrievePreAction (ProMdl p_retrieved_mdl);
ProError ProMultiCADSavePreAction (ProPath r_model_path);
ProError ProMultiCADSavePostAction (ProPath r_model_path);

ProError ProTestMultiCADFile()
{
    ProError status;
    int menu_id, menu_action;
	FILE *MultiCAD_fp;
  
    status = ProMenuFileRegister((char *)"MULTI-CAD",(char *)"tkmulticad.mnu", &menu_id);

    status = ProMenubuttonActionSet((char *)"MULTI-CAD", (char *)"Retrieve",
	(ProMenubuttonAction)ProMultiCADFileRetrieve, NULL, 0);

	status = ProMenubuttonActionSet((char *)"MULTI-CAD", (char *)"Info",
	(ProMenubuttonAction)ProMultiCADFileInfo, NULL, 0);
	
    status = ProMenubuttonActionSet((char *)"MULTI-CAD",(char *)"Done/Return",
		(ProMenubuttonAction)ProMenuDelete,NULL,0);
	
    status = ProMenubuttonActionSet((char *)"MULTI-CAD",(char *)"MULTI-CAD",
		(ProMenubuttonAction)ProMenuDelete,NULL,0);
	
/*--------------------------------------------------------------------*\
    Make main menu visible
\*--------------------------------------------------------------------*/
    status = ProMenuCreate( PROMENUTYPE_MAIN, (char *)"MULTI-CAD", &menu_id );
    TEST_CALL_REPORT( "ProMenuCreate()", "ProTestMultiCADFile()", 
			status, status != PRO_TK_NO_ERROR );
    if( status == PRO_TK_NO_ERROR )
    {
	status = ProMenuProcess( (char *)"MULTI-CAD", &menu_action );
	TEST_CALL_REPORT( "ProMenuProcess()", "ProTestMultiCADFile()", 
			    status, status != PRO_TK_NO_ERROR );
    }
   
	MultiCAD_fp = PTApplsUnicodeFopen ("MultiCAD_Notifications.inf", "w");

	/* Sets notification PRO_MODEL_SAVE_PRE */
    status = ProNotificationSet(PRO_MODEL_SAVE_PRE, ProMultiCADSavePreAction);
	TEST_CALL_REPORT( "ProNotificationSet()", "ProTestMultiCADFile()", 
			status, status != PRO_TK_NO_ERROR );

	/* Sets notification PRO_MODEL_SAVE_POST */
    status = ProNotificationSet(PRO_MODEL_SAVE_POST, ProMultiCADSavePostAction);
	TEST_CALL_REPORT( "ProNotificationSet()", "ProTestMultiCADFile()", 
			status, status != PRO_TK_NO_ERROR );

	/* Sets notification PRO_MODEL_SAVE_POST_ALL */
    status = ProNotificationSet(PRO_MODEL_SAVE_POST_ALL, ProMultiCADSavePostAction);
	TEST_CALL_REPORT( "ProNotificationSet()", "ProTestMultiCADFile()", 
			status, status != PRO_TK_NO_ERROR );
	
	fclose(MultiCAD_fp);

    return (status);
}


    FUNCTION : ProMultiCADSavePreAction	
    PURPOSE  : Callback function for notification PRO_MODEL_SAVE_PRE
ProError ProMultiCADSavePreAction (ProPath r_model_path)
{
	FILE *MultiCAD_fp;

	MultiCAD_fp = PTApplsUnicodeFopen ("MultiCAD_Notifications.inf", "a");

	ProTKFprintf ( MultiCAD_fp, "Called Notification PRO_MODEL_SAVE_PRE. \n");
	
	fclose(MultiCAD_fp);

	return (PRO_TK_NO_ERROR);
}

    FUNCTION : ProMultiCADSavePostAction	
    PURPOSE  : Callback function for notification PRO_MODEL_SAVE_POST
ProError ProMultiCADSavePostAction (ProPath r_model_path)
{
	FILE *MultiCAD_fp;

	MultiCAD_fp = PTApplsUnicodeFopen ("MultiCAD_Notifications.inf", "a");

	ProTKFprintf ( MultiCAD_fp, "Called Notification PRO_MODEL_SAVE_POST. \n");
	
	fclose(MultiCAD_fp);

	return (PRO_TK_NO_ERROR);
}

    FUNCTION : ProMultiCADSavePostAction	
    PURPOSE  : Callback function for notification PRO_MODEL_SAVE_POST_ALL
ProError ProMultiCADSavePostAllAction (ProPath r_model_path)
{
	FILE *MultiCAD_fp;

	MultiCAD_fp = PTApplsUnicodeFopen ("MultiCAD_Notifications.inf", "a");

	ProTKFprintf ( MultiCAD_fp, "Called Notification PRO_MODEL_SAVE_POST_ALL. \n");
	
	fclose(MultiCAD_fp);

	return (PRO_TK_NO_ERROR);
}



    FUNCTION : TkMultiCADFileRetrieve 	
    PURPOSE  : Action function for Retrieve	 (main->MULTI-CAD->Retreive)
ProError ProMultiCADFileRetrieve ()
{
    ProError status;
	ProMdlfileType *fileTypeArray, fileType;
	ProPath filePath;
	ProMdl mdlHandle;
	int i, winId;

	ProMdlfileType retrieveFileType;
	ProMdlName fileName;

	/* File types allowed/shown in toolkits file open dialog. */
	int multiCADTypes[9] = {PRO_MDLFILE_PART, PRO_MDLFILE_ASSEMBLY,
				PRO_MDLFILE_UG, PRO_MDLFILE_SW_PART, PRO_MDLFILE_SW_ASSEM,
				PRO_MDLFILE_CATIA_MODEL, PRO_MDLFILE_CATIA_CGR,
				PRO_MDLFILE_CATIA_PART, PRO_MDLFILE_CATIA_PRODUCT};
				
	status = ProArrayAlloc(0, sizeof(ProMdlfileType), 1, (ProArray*)&fileTypeArray);
    TEST_CALL_REPORT( "ProArrayAlloc()", "TkMultiCADFileRetrieve()", 
		status, status != PRO_TK_NO_ERROR);

	for (i = 0; i < 9; i++)
	{
		fileType = multiCADTypes[i];
		status = ProArrayObjectAdd ((ProArray*)&fileTypeArray, PRO_VALUE_UNUSED, 1, &fileType);
		TEST_CALL_REPORT( "ProArrayObjectAdd()", "TkMultiCADFileRetrieve()", 
			status, status != PRO_TK_NO_ERROR);
	}

	/* Opens toolkit's file open Dialog */
	status = ProFileMdlfiletypeOpen(L"TKMultiCAD Open", fileTypeArray, NULL, NULL, NULL, NULL, filePath);
    TEST_CALL_REPORT( "ProFileMdlfiletypeOpen()", "TkMultiCADFileRetrieve()", 
		status, status != PRO_TK_NO_ERROR && status != PRO_TK_USER_ABORT);

	if(status == PRO_TK_NO_ERROR)
	{
		/* Gets file type from input file path */
		status = ProFileSubtypeGet(filePath, &retrieveFileType, NULL, NULL);
		TEST_CALL_REPORT( "ProFileSubtypeGet()", "TkMultiCADFileRetrieve()", 
			status, status != PRO_TK_NO_ERROR);

		/* Gets file name from input file path */
		status = ProFileMdlnameParse(filePath, NULL, fileName, NULL, NULL);
		TEST_CALL_REPORT( "ProFileMdlnameParse()", "TkMultiCADFileRetrieve()", 
			status, status != PRO_TK_NO_ERROR);

		/* File names having more than 80 chars are not supported in Creo3 */
		status = ProMdlnameRetrieve(fileName, retrieveFileType, &mdlHandle);
		TEST_CALL_REPORT( "ProMdlnameRetrieve()", "TkMultiCADFileRetrieve()", 
			status, status != PRO_TK_NO_ERROR);

		status = ProMdlDisplay(mdlHandle);
		TEST_CALL_REPORT( "ProMdlFiletypeLoad()", "TkMultiCADFileRetrieve()", 
			status, status != PRO_TK_NO_ERROR);


		/* Gets window ID for retreived model */
		status = ProMdlWindowGet(mdlHandle, &winId);
		TEST_CALL_REPORT( "ProMdlWindowGet()", "TkMultiCADFileRetrieve()", 
			status, status != PRO_TK_NO_ERROR);

		/* Activates model window  */
		status = ProWindowActivate(winId);
		TEST_CALL_REPORT( "ProWindowActivate()", "TkMultiCADFileRetrieve()", 
			status, status != PRO_TK_NO_ERROR);
	}

    return (status);
}


    FUNCTION : TkMultiCADFileInfo	
    PURPOSE  : Action function for Info	 (main->MULTI-CAD->Info)
ProError ProMultiCADFileInfo (ProMdl model)
{
    ProError status;
	ProPath file_name;
	char file_cname[PRO_NAME_SIZE];

	FILE *MultiCADInfo_fp;

	strcpy(file_cname, "MultiCAD_Info.inf");
	ProStringToWstring (file_name, file_cname);
	MultiCADInfo_fp = PTApplsUnicodeFopen (file_cname, "w");

	/* Gets current model handle */
	status = ProMdlCurrentGet (&model);
	TEST_CALL_REPORT( "ProMdlCurrentGet()", "ProMultiCADFileInfo()", 
			status, status != PRO_TK_NO_ERROR && status != PRO_TK_BAD_CONTEXT);
	if(status != PRO_TK_NO_ERROR)
		return (status);

	ProTKFprintf (MultiCADInfo_fp,"*********************************** \n");
	ProTKFprintf (MultiCADInfo_fp,"       -MULTI-CAD File info \n");
	ProTKFprintf (MultiCADInfo_fp,"*********************************** \n");

	/* Utility to write current model info */
	status = ProUtilMultiCADFileInfo(model, MultiCADInfo_fp);
	TEST_CALL_REPORT( "ProUtilMultiCADFileInfo()", "ProMultiCADFileInfo()", 
			status, status != PRO_TK_NO_ERROR );

	fclose(MultiCADInfo_fp);

	status = ProInfoWindowDisplay(file_name, NULL, NULL);
	TEST_CALL_REPORT( "ProInfoWindowDisplay()", "ProMultiCADFileInfo()", 
			status, status != PRO_TK_NO_ERROR );

    return (status);
}