/*
Copyright (c) 2019 PTC Inc. and/or Its Subsidiary Companies. All Rights Reserved.
*/
/*----------------------------------------------------------------------------*\
Pro/TOOLKIT includes
\*----------------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProMenu.h>
#include <ProMenuBar.h>
#include <ProMessage.h>
#include <ProUICmd.h>
#include <ProUtil.h>
#include <ProTKRunTime.h>
#include <PTApplsUnicodeUtils.h>
/*----------------------------------------------------------------------------*\
Application includes
\*----------------------------------------------------------------------------*/
#include "TestError.h"
#include "TestMenu.h"
#include "UtilMessage.h"
/*----------------------------------------------------------------------------*\
Application data types
\*----------------------------------------------------------------------------*/
typedef struct user_command
{
char *name;
uiCmdCmdId id;
} UserCommand;
typedef struct user_check_but
{
uiCmdCmdId command;
ProBoolean state;
} UserCheckBut;
typedef struct user_push_but
{
char *action_name;
uiCmdCmdActFn action_cb;
char *button_name;
char *button_label;
char *button_help;
} UserPushButton;
/*----------------------------------------------------------------------------*\
Application global/external data
\*----------------------------------------------------------------------------*/
static wchar_t msgfil[] =
{ 'm','e','n','u','b','a','r','_','m','s','g','.','t','x','t','\0'};
static UserCheckBut check_but[2];
static uiCmdAccessState access_state = ACCESS_AVAILABLE;
static FILE *log_file = NULL;
static UserCommand user_actions[] = {
{(char*)"TestPushButtonAct1", (uiCmdCmdId)NULL},
{(char*)"TestPushButtonAct2", (uiCmdCmdId)NULL},
{(char*)"TestCheckButtonOpt1", (uiCmdCmdId)NULL},
{(char*)"TestCheckButtonOpt2", (uiCmdCmdId)NULL},
{(char*)"TestRadioGroupOpt", (uiCmdCmdId)NULL}};
/*====================================================================*\
FUNCTION : ProUtilLogFileWrite()
PURPOSE : Write message to the log file
\*====================================================================*/
static void ProUtilLogFileWrite(
char *func_type,
uiCmdCmdId command)
{
int i;
if (log_file == NULL)
return;
if (command == NULL)
{
ProTKFprintf(log_file, "%s function is called.\n", func_type);
ProTKPrintf( "%s function is called.\n", func_type);
return;
}
for (i=0; i<sizeof(user_actions)/sizeof(user_actions[0]); i++)
{
if (user_actions[i].id == command)
{
ProTKFprintf(log_file, "%s function is called for action %s.\n",
func_type, user_actions[i].name);
ProTKPrintf("%s function is called for action %s.\n",
func_type, user_actions[i].name);
break;
}
}
}
/*====================================================================*\
FUNCTION : ProTestAccessFunction()
PURPOSE : Enable access
\*====================================================================*/
static uiCmdAccessState ProTestAccessFunction(uiCmdAccessMode access_mode)
{
TEST_CALL_REPORT("uiCmdAccessFn()", "ProTestAccessFunction()", PRO_TK_NO_ERROR, 0);
ProUtilLogFileWrite( (char*)"!Access", NULL);
return (ACCESS_AVAILABLE);
}
/*====================================================================*\
FUNCTION : ProTestAccessFunction()
PURPOSE : Disable access
\*====================================================================*/
static uiCmdAccessState ProTestAccess(uiCmdAccessMode access_mode)
{
TEST_CALL_REPORT("uiCmdAccessFn()", "ProTestAccessFunction()", PRO_TK_NO_ERROR, 0);
ProUtilLogFileWrite( (char*)"!Access", NULL);
return (access_state);
}
/*====================================================================*\
FUNCTION : ProTestRadioButtonValue()
PURPOSE : Set value for radio group
\*====================================================================*/
int ProTestRadioButtonValue(
uiCmdCmdId command,
uiCmdValue *p_value)
{
ProError err;
ProMenuItemName name;
ProUtilLogFileWrite((char*)"Set_value callback", command);
TEST_CALL_REPORT("uiCmdCmdValFn()", "ProTestRadioButtonValue()", PRO_TK_NO_ERROR, 0);
#if 0
err = ProMenubarMenuRadiogrpValueGet (p_value, name);
TEST_CALL_REPORT("ProMenubarMenuRadiogrpValueGet()",
"ProTestRadioButtonValue()", err, err != PRO_TK_NO_ERROR);
err = ProMenubarMenuRadiogrpValueSet(p_value, name);
TEST_CALL_REPORT("ProMenubarMenuRadiogrpValueSet()",
"ProTestRadioButtonValue()", err, err != PRO_TK_NO_ERROR);
#endif
return (0);
}
/*====================================================================*\
FUNCTION : ProTestRadioButton()
PURPOSE : Callback functions for radio group options
\*====================================================================*/
int ProTestRadioButton(
uiCmdCmdId command,
uiCmdValue *p_value)
{
ProError err;
ProMenuItemName name;
ProUtilLogFileWrite((char*)"Callback", command);
TEST_CALL_REPORT("uiCmdCmdActFn()", "ProTestRadioButton()", PRO_TK_NO_ERROR, 0);
ProMessageDisplay(msgfil, (char*)"TEST Radio Group pressed.");
err = ProMenubarMenuRadiogrpValueGet (p_value, name);
TEST_CALL_REPORT("ProMenubarMenuRadiogrpValueGet()",
"ProTestRadioButtonValue()", err, err != PRO_TK_NO_ERROR);
return(0);
}
/*====================================================================*\
FUNCTION : ProTestCheckButtonValue()
PURPOSE : Set new value for check buttons
\*====================================================================*/
int ProTestCheckButtonValue(
uiCmdCmdId command,
uiCmdValue *p_value)
{
ProError err;
ProBoolean value;
int i;
TEST_CALL_REPORT("uiCmdCmdValFn()", "ProTestCheckButtonValue()", PRO_TK_NO_ERROR, 0);
for (i=0; i<sizeof(check_but)/sizeof(check_but[0]); i++)
if (check_but[i].command == command)
{
err = ProMenubarmenuChkbuttonValueGet (p_value, &value);
TEST_CALL_REPORT("ProMenubarmenuChkbuttonValueGet()",
"ProTestCheckButtonValue()", err, err != PRO_TK_NO_ERROR);
if (value == check_but[i].state)
continue;
ProUtilLogFileWrite((char*)"Set_value callback", command);
err = ProMenubarmenuChkbuttonValueSet(p_value, check_but[i].state);
TEST_CALL_REPORT("ProMenubarmenuChkbuttonValueSet()",
"ProTestCheckButtonValue()", err, err != PRO_TK_NO_ERROR);
break;
}
return(0);
}
/*====================================================================*\
FUNCTION : ProTestCheckButton()
PURPOSE : Callback function for check button options
\*====================================================================*/
int ProTestCheckButton(
uiCmdCmdId command,
uiCmdValue *p_value,
void *p_push_command_data)
{
int i;
ProUtilLogFileWrite((char*)"Callback", command);
TEST_CALL_REPORT("uiCmdCmdActFn()", "ProTestCheckButton()", PRO_TK_NO_ERROR, 0);
ProMessageDisplay(msgfil, (char*)"TEST Check Button pressed.");
for (i=0; i<sizeof(check_but)/sizeof(check_but[0]); i++)
if (check_but[i].command == command)
{
/* Change state of pressed button */
if (check_but[i].state == PRO_B_FALSE)
check_but[i].state = PRO_B_TRUE;
else
check_but[i].state = PRO_B_FALSE;
break;
}
return(0);
}
/*====================================================================*\
FUNCTION : ProTestPushButton()
PURPOSE : Callback function for push button actions
\*====================================================================*/
int ProTestPushButton(uiCmdCmdId command)
{
ProUtilLogFileWrite((char*)"Callback", command);
TEST_CALL_REPORT("uiCmdCmdActFn()", "ProTestPushButton()", PRO_TK_NO_ERROR, 0);
ProMessageDisplay(msgfil, (char*)"TEST Push Button pressed.");
return(0);
}
/*====================================================================*\
FUNCTION : ProTestBracketFunc()
PURPOSE : Bracket function, called before and after actions
\*====================================================================*/
int ProTestBracketFunc(
uiCmdCmdId command,
uiCmdValue *p_new_value,
int entering_command,
void **data)
{
ProUtilLogFileWrite(entering_command ? (char*)"Pre-action" : (char*)"Post-action",
command);
TEST_CALL_REPORT("uiCmdCmdBktFn()", "ProTestBracketFunc()", PRO_TK_NO_ERROR, 0);
return (entering_command);
}
/*====================================================================*\
FUNCTION : ProUtilAccessSet()
PURPOSE : change access to the user actions. Add/remove access function
\*====================================================================*/
ProError ProUtilAccessSet(uiCmdAccessState state)
{
ProError err;
static uiCmdAccessId
access_id[sizeof(user_actions)/sizeof(user_actions[0])];
int i;
TEST_CALL_REPORT("uiCmdCmdActFn()", "ProUtilAccessSet()", PRO_TK_NO_ERROR, 0);
for (i=0; i<sizeof(user_actions)/sizeof(user_actions[0]); i++)
{
if (user_actions[i].id == (uiCmdCmdId)NULL)
continue;
if (access_id[i] != (uiCmdAccessId)NULL)
{
err = ProCmdAccessFuncRemove(user_actions[i].id, access_id[i]);
TEST_CALL_REPORT("ProCmdAccessFuncRemove()",
"ProUtilAccessSet()", err, err != PRO_TK_NO_ERROR);
access_id[i] = (uiCmdAccessId)NULL;
}
access_state = state;
if (state != ACCESS_AVAILABLE)
{
err = ProCmdAccessFuncAdd(user_actions[i].id,
(uiCmdAccessFn)ProTestAccess, &access_id[i]);
TEST_CALL_REPORT("ProCmdAccessFuncAdd()",
"ProUtilAccessSet()", err, err != PRO_TK_NO_ERROR);
}
}
return (err);
}
/*====================================================================*\
FUNCTION : ProTestPushButtonAccessAvailable()
PURPOSE : Callback function. Set access to user actions available
\*====================================================================*/
int ProTestPushButtonAccessAvailable()
{
ProUtilAccessSet(ACCESS_AVAILABLE);
return(0);
}
/*====================================================================*\
FUNCTION : ProTestPushButtonAccessDisallow()
PURPOSE : Callback function. Set access to user actions disallow
\*====================================================================*/
int ProTestPushButtonAccessDisallow()
{
ProUtilAccessSet(ACCESS_DISALLOW);
return(0);
}
/*====================================================================*\
FUNCTION : ProTestPushButtonAccessInvisible()
PURPOSE : Callback function. Set access to user actions invisible
\*====================================================================*/
int ProTestPushButtonAccessInvisible()
{
ProUtilAccessSet(ACCESS_INVISIBLE);
return(0);
}
/*====================================================================*\
FUNCTION : ProTestPushButtonAccessUnavailable()
PURPOSE : Callback function. Set access to user actions unavailable
\*====================================================================*/
int ProTestPushButtonAccessUnavailable()
{
ProUtilAccessSet(ACCESS_UNAVAILABLE);
return(0);
}
/*====================================================================*\
FUNCTION : ProTestPushButtonLogStart()
PURPOSE : Callback function. Open log file for output
\*====================================================================*/
int ProTestPushButtonLogStart()
{
if (log_file == NULL)
{
log_file = (FILE *)PTApplsUnicodeFopen("menubar.log", "w");
}
return (0);
}
/*====================================================================*\
FUNCTION : ProTestPushButtonLogStop()
PURPOSE : Callback function. Close log file
\*====================================================================*/
int ProTestPushButtonLogStop()
{
if (log_file != NULL)
{
fclose(log_file);
log_file = NULL;
}
return (0);
}
/*====================================================================*\
FUNCTION : ProUtilActionsIdsGet()
PURPOSE : Get Ids for user actions added to menu bar
\*====================================================================*/
ProError ProUtilActionsIdsGet()
{
ProError err;
int i;
for (i=0; i<sizeof(user_actions)/sizeof(user_actions[0]); i++)
{
err = ProCmdCmdIdFind(user_actions[i].name, &user_actions[i].id);
if (err != PRO_TK_NO_ERROR)
user_actions[i].id = (uiCmdCmdId)NULL;
TEST_CALL_REPORT("ProCmdCmdIdFind()",
"ProUtilActionsIdsGet()", err, err != PRO_TK_NO_ERROR);
}
return (err);
}
/*====================================================================*\
FUNCTION : ProTestAddBrackets()
PURPOSE : Add ids for user actions added to menu bar
\*====================================================================*/
ProError ProTestAddBrackets()
{
ProError err;
int i;
for (i=0; i<sizeof(user_actions)/sizeof(user_actions[0]); i++)
{
if (user_actions[i].id == NULL)
continue;
err = ProCmdBracketFuncAdd(user_actions[i].id,
(uiCmdCmdBktFn)ProTestBracketFunc,
(char*)"ProTestBracketFunc", (void**)NULL);
TEST_CALL_REPORT("ProCmdBracketFuncAdd()",
"ProUtilActionsIdsGet()", err, err != PRO_TK_NO_ERROR);
}
return (err);
}
/*============================================================================*\
Function : ProTestMenuBar
Purpose : Create a menu to test Menu Bar functions
\*============================================================================*/
int ProTestMenuBar()
{
static UserPushButton push_buts[] =
{
{(char*)"TestAccessInvisible",
(uiCmdCmdActFn)ProTestPushButtonAccessInvisible,
(char*)"TestInvisible",(char*) "Invisible", (char*)"Test change access"},
{(char*)"TestAccessUnavailable",
(uiCmdCmdActFn)ProTestPushButtonAccessUnavailable,
(char*)"TestUnavailable", (char*)"Unavailable", (char*)"Test change access"},
{(char*)"TestAccessDisallow",
(uiCmdCmdActFn)ProTestPushButtonAccessDisallow,
(char*)"TestDisallow", (char*)"Disallow", (char*)"Test change access"},
{(char*)"TestAccessAvailable",
(uiCmdCmdActFn)ProTestPushButtonAccessAvailable,
(char*)"TestAvailable", (char*)"Available", (char*)"Test change access"},
{(char*)"TestLogStart",
(uiCmdCmdActFn)ProTestPushButtonLogStart,
(char*)"TestStart", (char*)"Log start", (char*)"Start log"},
{(char*)"TestLogStop",
(uiCmdCmdActFn)ProTestPushButtonLogStop,
(char*)"TestStop", (char*)"Log stop", (char*)"Stop log"}
};
ProError err;
uiCmdCmdId push_act, push_act2, action;
uiCmdCmdId radio_act;
int i;
static ProMenuItemName radio_group_items[]=
{"TestRadio1", "TestRadio2", "TestRadio3", ""};
static ProMenuItemLabel radio_group_labels[]=
{"Radio button 1", "Radio button 2", "Radio button 3", ""};
static ProMenuLineHelp radio_group_help[]=
{"Test radio button", "Test radio button", "Test radio button", ""};
/*---------------------------------------------------------------------*\
Add new button to the menu bar
\*---------------------------------------------------------------------*/
err = ProMenubarMenuAdd((char*)"TestMenuBar", (char*)"-MenuBar", (char*)"Help", PRO_B_FALSE,
msgfil);
TEST_CALL_REPORT("ProMenubarMenuAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProCmdActionAdd((char*)"TestPushButtonAct1",
(uiCmdCmdActFn)ProTestPushButton, uiCmdPrioDefault,
ProTestAccessFunction, PRO_B_TRUE, PRO_B_TRUE, &push_act);
TEST_CALL_REPORT("ProCmdActionAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProCmdActionAdd((char*)"TestPushButtonAct2",
(uiCmdCmdActFn)ProTestPushButton, uiCmdPrioDefault,
ProTestAccessFunction, PRO_B_TRUE, PRO_B_TRUE, &push_act2);
TEST_CALL_REPORT("ProCmdActionAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProCmdOptionAdd((char*)"TestCheckButtonOpt1",
(uiCmdCmdActFn)ProTestCheckButton, PRO_B_TRUE,
(uiCmdCmdValFn)ProTestCheckButtonValue,
ProTestAccessFunction, PRO_B_TRUE, PRO_B_TRUE, &check_but[0].command);
TEST_CALL_REPORT("ProCmdOptionAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProCmdOptionAdd((char*)"TestCheckButtonOpt2",
(uiCmdCmdActFn)ProTestCheckButton, PRO_B_TRUE,
(uiCmdCmdValFn)ProTestCheckButtonValue,
ProTestAccessFunction, PRO_B_TRUE, PRO_B_TRUE, &check_but[1].command);
TEST_CALL_REPORT("ProCmdOptionAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProCmdOptionAdd((char*)"TestRadioGroupOpt",
(uiCmdCmdActFn)ProTestRadioButton, PRO_B_FALSE,
(uiCmdCmdValFn)ProTestRadioButtonValue,
ProTestAccessFunction, PRO_B_TRUE, PRO_B_TRUE, &radio_act);
TEST_CALL_REPORT("ProCmdActionAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProMenubarmenuPushbuttonAdd((char*)"TestMenuBar", (char*)"TestPushBut1", (char*)"Push button 1",
(char*)"Test push button", (char*)"", PRO_B_FALSE, push_act, msgfil);
TEST_CALL_REPORT("ProMenubarmenuPushbuttonAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProMenubarmenuMenuAdd((char*)"TestMenuBar", (char*)"TestMenuBarMenu", (char*)"Submenu",
(char*)"TestPushBut1", PRO_B_FALSE, msgfil);
TEST_CALL_REPORT("ProMenubarmenuMenuAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProMenubarmenuPushbuttonAdd((char*)"TestMenuBarMenu", (char*)"TestPushBut2",
(char*)"Push button 2",
(char*)"Test push button", (char*)"", PRO_B_FALSE, push_act2, msgfil);
TEST_CALL_REPORT("ProMenubarmenuPushbuttonAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProMenubarmenuChkbuttonAdd((char*)"TestMenuBarMenu", (char*)"TestChkBut2",
(char*)"Check button 2",
(char*)"Test check button", (char*)"TestPushBut2", PRO_B_TRUE, check_but[1].command,
msgfil);
TEST_CALL_REPORT("ProMenubarmenuChkbuttonAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProMenubarmenuChkbuttonAdd((char*)"TestMenuBar", (char*)"TestChkBut1", (char*)"Check button 1",
(char*)"Test check button", (char*)"TestPushBut1", PRO_B_TRUE, check_but[0].command,
msgfil);
TEST_CALL_REPORT("ProMenubarmenuChkbuttonAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
for (i=0; i<sizeof(push_buts)/sizeof(push_buts[0]); i++)
{
err = ProCmdActionAdd(push_buts[i].action_name,
push_buts[i].action_cb, uiCmdPrioDefault,
ProTestAccessFunction, PRO_B_TRUE, PRO_B_TRUE, &action);
TEST_CALL_REPORT("ProCmdActionAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProMenubarmenuPushbuttonAdd((char*)"TestMenuBar", push_buts[i].button_name,
push_buts[i].button_label, push_buts[i].button_help,
i == 0 ? (char*)"TestChkBut1" : push_buts[i-1].button_name, PRO_B_TRUE,
action, msgfil);
TEST_CALL_REPORT("ProMenubarmenuPushbuttonAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
}
err = ProMenubarmenuRadiogrpAdd((char*)"TestMenuBarMenu", (char*)"TestRadioGrp1",
3, radio_group_items, radio_group_labels, radio_group_help,
(char*)"TestChkBut2", PRO_B_TRUE, radio_act, msgfil);
TEST_CALL_REPORT("ProMenubarmenuRadiogrpAdd()",
"ProTestMenuBar()", err, err != PRO_TK_NO_ERROR);
err = ProUtilActionsIdsGet();
err = ProTestAddBrackets();
return(0);
}