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


/*--------------------------------------------------------------------*\
Pro/Toolkit includes
\*--------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <Pro2dEntdef.h>
#include <ProANSI.h>
#include <ProAnalysis.h>
#include <ProAnimate.h>
#include <ProArray.h>
#include <ProAsmcomp.h>
#include <ProAsmcomppath.h>
#include <ProAssembly.h>
#include <ProAutodrill.h>
#include <ProAxis.h>
#include <ProCabling.h>
#include <ProCavitylayout.h>
#include <ProCavlayrule.h>
#include <ProChamfer.h>
#include <ProClCmd.h>
#include <ProClcmdElem.h>
#include <ProCollect.h>
#include <ProColor.h>
#include <ProComm.h>
#include <ProConst.h>
#include <ProContour.h>
#include <ProContourdata.h>
#include <ProCopyGeom.h>
#include <ProCore.h>
#include <ProCsys.h>
#include <ProCsysdata.h>
#include <ProCurve.h>
#include <ProCurvedata.h>
#include <ProDatumdata.h>
#include <ProDimension.h>
#include <ProDisplist.h>
#include <ProDrawing.h>
#include <ProDtlattach.h>
#include <ProDtlentity.h>
#include <ProDtlgroup.h>
#include <ProDtlitem.h>
#include <ProDtlnote.h>
#include <ProDtlsymdef.h>
#include <ProDtlsyminst.h>
#include <ProDtmAxis.h>
#include <ProDtmCrv.h>
#include <ProDtmCrvSketch.h>
#include <ProDtmCsys.h>
#include <ProDtmPln.h>
#include <ProDtmPnt.h>
#include <ProDwgtable.h>
#include <ProEdge.h>
#include <ProEdgedata.h>
#include <ProElemId.h>
#include <ProElement.h>
#include <ProElempath.h>
#include <ProExpldstate.h>
#include <ProExtdata.h>
#include <ProExtobj.h>
#include <ProExtobjCB.h>
#include <ProExtobjDisp.h>
#include <ProExtobjRef.h>
#include <ProExtobjSel.h>
#include <ProExtrude.h>
#include <ProFaminstance.h>
#include <ProFamtable.h>
#include <ProFeatForm.h>
#include <ProFeatIntr.h>
#include <ProFeatType.h>
#include <ProFeature.h>
#include <ProFemMesh.h>
#include <ProFemObjects.h>
#include <ProFlatSrf.h>
#include <ProForeignCurve.h>
#include <ProGeomitem.h>
#include <ProGeomitemdata.h>
#include <ProGraphic.h>
#include <ProGroup.h>
#include <ProGtol.h>
#include <ProHardware.h>
#include <ProHole.h>
#include <ProImm.h>
#include <ProImportfeat.h>
#include <ProIntf3Dexport.h>
#include <ProIntfData.h>
#include <ProIntfimport.h>
#include <ProItemerr.h>
#include <ProJlink.h>
#include <ProLayer.h>
#include <ProMaterial.h>
#include <ProMdl.h>
#include <ProMdlChk.h>
#include <ProMenu.h>
#include <ProMenuBar.h>
#include <ProMessage.h>
#include <ProMfg.h>
#include <ProMfgdb.h>
#include <ProMfgoper.h>
#include <ProModFeat.h>
#include <ProMode.h>
#include <ProModelitem.h>
#include <ProMoldbase.h>
#include <ProNcseq.h>
#include <ProNcseqElem.h>
#include <ProNote.h>
#include <ProNotify.h>
#include <ProObjects.h>
#include <ProParameter.h>
#include <ProParamval.h>
#include <ProPart.h>
#include <ProPattern.h>
#include <ProPecktable.h>
#include <ProPiping.h>
#include <ProPoint.h>
#include <ProPrint.h>
#include <ProProcstep.h>
#include <ProQuilt.h>
#include <ProQuiltdata.h>
#include <ProRefInfo.h>
#include <ProRelSet.h>
#include <ProReplace.h>
#include <ProRevolve.h>
#include <ProRib.h>
#include <ProRmdt.h>
#include <ProRule.h>
#include <ProScope.h>
#include <ProSecConstr.h>
#include <ProSecdim.h>
#include <ProSecdimType.h>
#include <ProSecerror.h>
#include <ProSection.h>
#include <ProSelection.h>
#include <ProSheetmetal.h>
#include <ProShrinkwrap.h>
#include <ProSimprep.h>
#include <ProSimprepdata.h>
#include <ProSizeConst.h>
#include <ProSkeleton.h>
#include <ProSolid.h>
#include <ProStdSection.h>
#include <ProSurface.h>
#include <ProSurfacedata.h>
#include <ProSweep.h>
#include <ProTool.h>
#include <ProToolElem.h>
#include <ProToolinput.h>
#include <ProToolkitDll.h>
#include <ProUI.h>
#include <ProUICascadebutton.h>
#include <ProUICheckbutton.h>
#include <ProUICmd.h>
#include <ProUIDialog.h>
#include <ProUIInputpanel.h>
#include <ProUILabel.h>
#include <ProUILayout.h>
#include <ProUIList.h>
#include <ProUIMenubar.h>
#include <ProUIMenupane.h>
#include <ProUIMessage.h>
#include <ProUIOptionmenu.h>
#include <ProUIProgressbar.h>
#include <ProUIPushbutton.h>
#include <ProUIRadiogroup.h>
#include <ProUISlider.h>
#include <ProUISpinbox.h>
#include <ProUITab.h>
#include <ProUITable.h>
#include <ProUITextarea.h>
#include <ProUIThumbwheel.h>
#include <ProUdf.h>
#include <ProUtil.h>
#include <ProUvStat.h>
#include <ProValue.h>
#include <ProVerstamp.h>
#include <ProView.h>
#include <ProWcell.h>
#include <ProWchar.h>
#include <ProWeld.h>
#include <ProWindows.h>
#include <ProWorkspace.h>
#include <ProWstring.h>
#include <ProXsec.h>
#include <ProTKRunTime.h>

/*--------------------------------------------------------------------*\
Application includes
\*--------------------------------------------------------------------*/
#include "TestError.h"
#include <time.h>

/*--------------------------------------------------------------------*\
Application global/external data
\*--------------------------------------------------------------------*/
static wchar_t  MSGFIL[] = {'m','s','g','_','u','s','e','r','.','t','x','t','\0'};
static char revcode[PRO_LINE_SIZE];

/* Declare function */
ProError  ProTestInstallationCheck();
ProError  ProTestInstallationURLCheck();
static ProError ProTestStdCloseAction (char* dialog, char* component, ProAppData data); 
ProError  ProTestDialogCreate ( ProBoolean is_successful );

static uiCmdAccessState TestAccessDefault(uiCmdAccessMode access_mode)
{
    return (ACCESS_AVAILABLE);
}

/*===========================================================================*\
  Function : main
  Purpose  : Test the ProToolkitMain() function. main is optional function.
\*===========================================================================*/
main(argc, argv)
int  argc;
char **argv;
{
    ProTKFprintf(stderr, "\n\tWelcome to Pro/TOOLKIT  -  The \"pt_install_test\" program\n");

    ProToolkitMain(argc, argv);

    return(0);
}


/*====================================================================*\
FUNCTION : user_initialize()
PURPOSE  : Pro/DEVELOP standard initialize - define menu button
\*====================================================================*/
int user_initialize(
    int argc,			
    char *argv[],
    char *version, 
    char *build,
    wchar_t errbuf[80])
{

    char cbuff1[PRO_PATH_SIZE], cbuff2[PRO_PATH_SIZE];
    char astr1[PRO_LINE_SIZE];
    int i, menu_id;
    ProPath wbuff1, wbuff2;
    ProError status;
    uiCmdCmdId	cmd_id;

    ProUITranslationFilesEnable();

/*---------------------------------------------------------------------*\
   Loging file open. 
\*---------------------------------------------------------------------*/
    if(argc > 4)
        ProTestErrlogOpen(argv[4], version, build);
    else
        ProTestErrlogOpen("pt_toolkit", version, build);


/*---------------------------------------------------------------------*\
    First confirm the size of wchar_t
\*---------------------------------------------------------------------*/
    status = ProWcharSizeVerify (sizeof (wchar_t), &i);
    TEST_CALL_REPORT("ProWcharSizeVerify", "user_initialize",
                      status, status != PRO_TK_NO_ERROR);

    if ( status != PRO_TK_NO_ERROR || (i != sizeof (wchar_t)) )
    {
         ProTKSprintf(astr1,"ERROR wchar_t Incorrect size (%d). Should be: %d",
		sizeof(wchar_t), i );
         status = ProMessageDisplay(MSGFIL, "USER %0s", astr1);
         TEST_CALL_REPORT("ProMessageDisplay", "user_initialize",
                           status, status != PRO_TK_NO_ERROR);

	 ProTKPrintf("%s\n", astr1);
	 ProStringToWstring(errbuf, astr1);
	 return(-1);
    }

/*---------------------------------------------------------------------*\
    Add new button to the menu bar
\*---------------------------------------------------------------------*/
    ProTKSprintf(revcode, "%s - %s", version, build);

    ProMessageDisplay( MSGFIL, "USER %0s", "" );
    status = ProCmdActionAdd("-Install Test",
	(uiCmdCmdActFn)ProTestInstallationCheck,
	uiProe2ndImmediate, TestAccessDefault,
	PRO_B_TRUE, PRO_B_TRUE, &cmd_id);
    TEST_CALL_REPORT("ProCmdActionAdd", "user_initialize",
                      status, status != PRO_TK_NO_ERROR);

    status = ProMenubarmenuPushbuttonAdd(
	"File", "-Install Test", "-Install Test Label", "Install Test Help",
	"File.psh_rename", PRO_B_TRUE, cmd_id, MSGFIL);
    TEST_CALL_REPORT("ProMenubarmenuPushbuttonAdd", "user_initialize",
                      status, status != PRO_TK_NO_ERROR);

/*---------------------------------------------------------------------*\
    New Button for URL in Embedded Browser 
\*---------------------------------------------------------------------*/

    status = ProCmdActionAdd("TOOLKIT Compilers",
	(uiCmdCmdActFn)ProTestInstallationURLCheck,
	uiProe2ndImmediate, TestAccessDefault,
	PRO_B_TRUE, PRO_B_TRUE, &cmd_id);
    TEST_CALL_REPORT("ProCmdActionAdd", "user_initialize",
                      status, status != PRO_TK_NO_ERROR);

    status = ProMenubarmenuPushbuttonAdd( "Help",
	"TOOLKIT Compilers", "Creo Parametric TOOLKIT Compilers Label", "Creo Parametric TOOLKIT Compilers Help",
	NULL, PRO_B_TRUE, /* Always add at the bottom of the Help Menubar */ 
	cmd_id, MSGFIL);

    TEST_CALL_REPORT("ProMenubarmenuPushbuttonAdd", "user_initialize",
                      status, status != PRO_TK_NO_ERROR);

/*---------------------------------------------------------------------*\
    Print the protk.dat  info
\*---------------------------------------------------------------------*/

    status = ProToolkitApplExecPathGet(wbuff1);
    TEST_CALL_REPORT("ProToolkitApplExecPathGet", "user_initialize",
                      status, status != PRO_TK_NO_ERROR);

    status = ProToolkitApplTextPathGet(wbuff2);
    TEST_CALL_REPORT("ProToolkitApplTextPathGet", "user_initialize",
                      status, status != PRO_TK_NO_ERROR);

    ProWstringToString(cbuff1, wbuff1);
    ProWstringToString(cbuff2, wbuff2);
    ProTKPrintf("\n     Exec_path:  %s\n", cbuff1);
    ProTKPrintf("     Text_path:  %s\n\n", cbuff2);

    for(i=0; i<argc; i++)
        ProTKPrintf("   argv[%d]: %s\n", i, argv[i]);

    /* Upon success */
    return (0);

#if 0
    /* If unsuccessful, return non-zero.
     * You may store an error message in errbuf.
     * The return value and error message will be displayed to the user.
     * Pro/ENGINEER will call user_terminate() and shut down your application
     */
     ProStringToWstring(errbuf, "Sample error message");
     return(-1);
#endif
}

/*====================================================================*\
FUNCTION : user_terminate()
PURPOSE  : To handle any termination actions
\*====================================================================*/
void user_terminate()
{
/*---------------------------------------------------------------------*\
   Loging file close. 
\*---------------------------------------------------------------------*/
    ProTestErrlogClose();

    ProTKPrintf("user_terminate\n");
}

/*====================================================================*\
FUNCTION : ProTestInstallationCheck
PURPOSE  : Open a internationalized modal dialog with the test result
\*====================================================================*/
ProError  ProTestInstallationCheck()
{
    int 	window_id;
    ProError 	status; 
    ProBoolean 	is_successful = PRO_B_FALSE; 

    /* Call a sample Pro/TOOLKIT feature */
    status = ProWindowCurrentGet ( &window_id ); 
    TEST_CALL_REPORT( "ProWindowCurrentGet", "ProTestInstallationCheck",
                      status, status != PRO_TK_NO_ERROR);

    if ( status == PRO_TK_NO_ERROR )
    {
         /* Set flag for a SUCCESS dialog */ 
      is_successful = PRO_B_TRUE; 
    }
    else
    {
         /* Set flag for a FAILURE dialog */ 
      is_successful = PRO_B_FALSE; 
    }

/*---------------------------------------------------------------------*\
         Create and Display the dialog
\*---------------------------------------------------------------------*/
      status = ProTestDialogCreate ( is_successful ); 
      TEST_CALL_REPORT( "ProTestDialogCreate", "ProTestInstallationCheck",
                      status, status != PRO_TK_NO_ERROR);

  return (status);
}

/*====================================================================*\
FUNCTION : ProTestStdCloseAction
PURPOSE  : Close Action for Dialog
\*====================================================================*/
static ProError ProTestStdCloseAction (char* dialog, char* component, ProAppData data)
{
  ProError status;

  status = ProUIDialogExit (dialog, PRO_TK_NO_ERROR);
  TEST_CALL_REPORT( "ProUIDialogExit", "ProTestStdCloseAction",
                      status, status != PRO_TK_NO_ERROR);
  return status; 
}

/*====================================================================*\
FUNCTION : ProTestInstallationURLCheck
PURPOSE  : Open the URL for PTC Supports Web Page in Embedded Browser
\*====================================================================*/
ProError  ProTestInstallationURLCheck()
{
    int 	window_id;
    ProError 	status; 
    ProComment 	url; 

/*---------------------------------------------------------------------*\
         Call a sample Pro/TOOLKIT feature 
\*---------------------------------------------------------------------*/
    status = ProWindowCurrentGet ( &window_id ); 
    TEST_CALL_REPORT( "ProWindowCurrentGet", "ProTestInstallationURLCheck",
                      status, status != PRO_TK_NO_ERROR);

    if ( status == PRO_TK_NO_ERROR ) 
    {
/*---------------------------------------------------------------------*\
         Load a sample URL 
\*---------------------------------------------------------------------*/
      ProStringToWstring ( url, "http://www.ptc.com/partners/hardware/current/support.htm"); 
      status = ProWindowURLShow ( window_id, url ); 
      TEST_CALL_REPORT( "ProWindowURLShow", "ProTestInstallationURLCheck",
                      status, status != PRO_TK_NO_ERROR);
    }

    return (status); 
}

/*====================================================================*\
FUNCTION : ProTestDialogCreate
PURPOSE  : Common utility for creation of dialog
\*====================================================================*/
ProError  ProTestDialogCreate ( ProBoolean  is_successful )
{
    ProMdl 	model;
    int 	dialog_status; 
    ProError 	status; 
    ProComment  message_wchar; 
    ProComment  title_wchar; 

    char *	dialog = "pt_install_dialog"; 

    status = ProUIDialogCreate( dialog, dialog );
    TEST_CALL_REPORT( "ProUIDialogCreate", "ProTestDialogCreate",
                      status, status != PRO_TK_NO_ERROR);

    status = ProUIDialogCloseActionSet( dialog, 
		(ProUIAction)ProTestStdCloseAction, NULL );
    TEST_CALL_REPORT( "ProUIDialogCloseActionSet", "ProTestDialogCreate",
                      status, status != PRO_TK_NO_ERROR);

    status = ProUIPushbuttonActivateActionSet( dialog, "CloseBtn",
		(ProUIAction)ProTestStdCloseAction, NULL );
    TEST_CALL_REPORT( "ProUIPushbuttonActivateActionSet", "ProTestDialogCreate",
                      status, status != PRO_TK_NO_ERROR);

    if ( is_successful == PRO_B_TRUE )
    {
      status = ProMessageToBuffer ( message_wchar, MSGFIL, "USER Succeeded" ); 
      TEST_CALL_REPORT( "ProMessageToBuffer", "ProTestDialogCreate",
                      status, status != PRO_TK_NO_ERROR);
    }
    else
    {
      status = ProMessageToBuffer ( message_wchar, MSGFIL, "USER Failed" ); 
      TEST_CALL_REPORT( "ProMessageToBuffer", "ProTestDialogCreate",
                      status, status != PRO_TK_NO_ERROR);
    }

    status = ProUILabelTextSet( dialog, "Message", message_wchar ); 
    TEST_CALL_REPORT( "ProUILabelTextSet", "ProTestDialogCreate",
                      status, status != PRO_TK_NO_ERROR);

    status = ProUIDialogActivate( dialog, &dialog_status );
    TEST_CALL_REPORT( "ProUIDialogActivate", "ProTestDialogCreate",
                      status, status != PRO_TK_NO_ERROR);

    status = ProUIDialogDestroy( dialog );
    TEST_CALL_REPORT( "ProUIDialogDestroy", "ProTestDialogCreate",
                      status, status != PRO_TK_NO_ERROR);

  return (status);
}