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

#include <ProToolkit.h>
#include <ProDrawing.h>
#include <ProMessage.h>
#include <ProMdl.h>
#include <ProModelitem.h>
#include <ProWindows.h>
#include <ProDwgtable.h>
#include <ProUtil.h>
#include <ProUIDialog.h>
#include <ProUIList.h>
#include <ProUIPushbutton.h>
#include <ProUITextarea.h>


#include "UtilString.h"
#include "UtilFiles.h"
#include "TestError.h"
#include "UtilNames.h"

#define OK 1
#define CANCEL 0

void list_OKAction(char *dialog, char *component, ProAppData data);
void list_CancelAction(char *dialog, char *component, ProAppData data);
ProError UserUIListImplement ();

/*==================================================================*\
  	FUNCTION : list_OKAction()
  	PURPOSE  : Action function for the "OK" button
\*==================================================================*/
void list_OKAction(char *dialog, char *component, ProAppData data)
{
  ProError status;

  status = ProUIDialogExit(dialog, OK);
  TEST_CALL_REPORT ("ProUIDialogExit()", "list_OKAction()",
		    status, status!=PRO_TK_NO_ERROR);
}
/*==================================================================*\
  	FUNCTION : list_CancelAction()
  	PURPOSE  : Action function for the "Cancel" button
\*==================================================================*/
void list_CancelAction(char *dialog, char *component, ProAppData data)
{
  ProError status;

  status = ProUIDialogExit(dialog, CANCEL);
   TEST_CALL_REPORT ("ProUIDialogExit()", "list_CancelAction()",
		    status, status!=PRO_TK_NO_ERROR);
}



/*===========================================================================*\
  FUNCTION: UserUIListImplement
  PURPOSE:  demonstrates how to use the UI ListNames and ListLabel 
            Set functions
\*===========================================================================*/
ProError UserUIListImplement ()
{
  ProError                status;
  ProDrawing              drawing;
  ProSolid                *solids;
  ProLine                 wline;
  wchar_t                 **model_names;
  int                     i, exit_status, num; 
  char                    **strings, type;
  char                    *list_dialog = "ug_uilist";
  char                    *list_comp = "ug_uilist_comp";
  char                    *list_txtarea = "ug_uilist_txtarea";
  char                    *list_pbok = "ug_uilist_ok";
  char                    *list_pbcancel = "ug_uilist_cancel";

  /*-------------------------------------------------*\
    Get current drawing
  \*-------------------------------------------------*/
  status = ProMdlCurrentGet ((ProMdl*)&drawing);
  TEST_CALL_REPORT ("ProMdlCurrentGet()", "UserUIListImplement()",
		    status, status!=PRO_TK_NO_ERROR);

  /*-------------------------------------------------*\
    Get the models that make the drawing
  \*-------------------------------------------------*/
  status = ProDrawingSolidsCollect(drawing, &solids);
  TEST_CALL_REPORT ("ProDrawingTablesCollect()", "UserUIListImplement()",
		    status, status!=PRO_TK_NO_ERROR);

  /*-------------------------------------------------*\
    Allocate memory for the char and wchar string arrays
  \*-------------------------------------------------*/
  if (status == PRO_TK_NO_ERROR)
    {
      status = ProArraySizeGet ((ProArray)solids, &num);
      TEST_CALL_REPORT ("ProArraySizeGet()", "UserUIListImplement()",
			status, status!=PRO_TK_NO_ERROR);

      status = ProArrayAlloc (num, sizeof(wchar_t *), 1, 
			      (ProArray *)&model_names);
      TEST_CALL_REPORT ("ProArrayAlloc()", "UserUIListImplement()",
			status, status!=PRO_TK_NO_ERROR);

      status = ProArrayAlloc(num, sizeof(char *), 1, (ProArray *)&strings);
      TEST_CALL_REPORT ("ProArrayAlloc()", "UserUIListImplement()",
			status, status!=PRO_TK_NO_ERROR);
      
      /*-------------------------------------------------*\
	Allocate memory for the char and wchar strings
      \*-------------------------------------------------*/
      for (i=0; i<num; i++)
        {
	  model_names[i] = (wchar_t *)calloc(PRO_MDLNAME_SIZE, sizeof(wchar_t));
	  strings[i] = (char *)calloc(PRO_MDLNAME_SIZE, sizeof(char));

	  /*-------------------------------------------------*\
	    Get the names of the models that makeup the drawing
	  \*-------------------------------------------------*/
	  status = ProMdlMdlnameGet ((ProMdl)solids[i],  model_names[i]);
	  TEST_CALL_REPORT ("ProMdlMdlnameGet()", "UserUIListImplement()",
			status, status!=PRO_TK_NO_ERROR);

	  /*-------------------------------------------------*\
	    convert widestrings to strings
	  \*-------------------------------------------------*/
	  ProWstringToString(strings[i], model_names[i]);
        }

      /*-------------------------------------------------*\
	Create and set the pushbutton activate actions
      \*-------------------------------------------------*/
      status = ProUIDialogCreate (list_dialog, list_dialog); 
      TEST_CALL_REPORT ("ProUIDialogCreate()", "UserUIListImplement()",
		    status, status!=PRO_TK_NO_ERROR );

      status = ProUIPushbuttonActivateActionSet (list_dialog, list_pbok,  
						 list_OKAction, NULL); 
      TEST_CALL_REPORT ("ProUIPushbuttonActivateSet()", 
			"UserUIListImplement()", status, 
			status!=PRO_TK_NO_ERROR );

      status = ProUIPushbuttonActivateActionSet (list_dialog, list_pbcancel,  
						 list_CancelAction, NULL); 
      TEST_CALL_REPORT ("ProUIPushbuttonActivateSet()", 
			"UserUIListImplement()", status, 
			status!=PRO_TK_NO_ERROR );

      /*-------------------------------------------------*\
	Populate the list with the model names after activating
	the dialog and destroy the dialog when done
      \*-------------------------------------------------*/

      status = ProUIListNamesSet (list_dialog, list_comp, num, strings); 
      TEST_CALL_REPORT ("ProUIListNamesSet()", "UserUIListImplement()",
		    status, status!=PRO_TK_NO_ERROR );

      status = ProUIListLabelsSet (list_dialog, list_comp, num, model_names); 
      TEST_CALL_REPORT ("ProUIListLabelsSet()", "UserUIListImplement()",
		    status, status!=PRO_TK_NO_ERROR );

      ProStringToWstring(wline, 
		 "These are the names of the parts\nthat makeup the drawing");
 
      status = ProUITextareaValueSet(list_dialog, list_txtarea, wline);
      TEST_CALL_REPORT ("ProUIListLabelsSet()", "UserUIListImplement()",
		    status, status!=PRO_TK_NO_ERROR );
      

      status = ProUIDialogActivate (list_dialog, &exit_status);
      TEST_CALL_REPORT ("ProUIDialogActivate()", "UserUIListImplement()",
		    status, status!=PRO_TK_NO_ERROR );

      status = ProUIDialogDestroy (list_dialog);
      TEST_CALL_REPORT ("ProUIDialogDestroy()", "UserUIListImplement()",
		    status, status!=PRO_TK_NO_ERROR );
      
      /*-------------------------------------------------*\
	Free memory
      \*-------------------------------------------------*/
      
      status = ProArrayFree ((ProArray*)&solids);
      TEST_CALL_REPORT ("ProArrayFree()", "UserUIListImplement()",
			status, status!=PRO_TK_NO_ERROR);

      status = ProArrayFree((ProArray *)&model_names);
      TEST_CALL_REPORT ("ProWstringproarrayFree()", "UserUIListImplement()",
			status, status!=PRO_TK_NO_ERROR);
      
      status = ProArrayFree((ProArray *)&strings);
      TEST_CALL_REPORT ("ProStringproarrayFree()", "UserUIListImplement()",
			status, status!=PRO_TK_NO_ERROR);
      
    }

    return(PRO_TK_NO_ERROR);
}