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


/*--------------------------------------------------------------------*\
    Pro/TOOLKIT includes
\*--------------------------------------------------------------------*/
#include <ProToolkit.h>
#include <ProArray.h>
#include <ProMdl.h>
#include <ProDrawing.h>
#include <ProMenu.h>
#include <ProUtil.h>
#include <ProDtlgroup.h>

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

#define GRP_EDIT_ADD        1
#define GRP_EDIT_REMOVE     2

/*---------------------------------------------------------------------*\
    Functions declaration
\*---------------------------------------------------------------------*/
int ProTestDtlGroupCreate (void*, int);
int ProTestDtlGroupSuppress (void*, int);
int ProTestDtlGroupResume (void*, int);
int ProTestDtlGroupExplode (void*, int);
int ProTestDtlGroupEditMenu (void*, int);
int ProTestDtlGroupEdit (void*, int);
int ProTestDtlGroupList (void*, int);
int ProTestDtlGroupSelect (ProDrawing, ProDtlgroup*);
int ProTestDtlGroupSelectMenu (ProDrawing, ProDtlgroup*);
int ProTestDtlGroupSelectByName (ProDrawing, ProDtlgroup*);
int ProTestDtlitemsCompare (ProDtlitem*, ProDtlitem*);

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupMenu()
    Purpose:    On-button function. Set up the dtl group menu
    Returns:    0 - success; -1 - error.
\*---------------------------------------------------------------------*/
int ProTestDtlGroupMenu( ProDrawing drawing )
{
    ProError    status;
    int         menu_id;    /* The identifier of the created menu */
    int         action;

    /*---------------------------------*\
    Create new menu Group
    \*---------------------------------*/

    /* Load base menu from file */
    status = ProMenuFileRegister( (char*)"Group", (char*)"tkdtlgroup.mnu", &menu_id );
    TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestDtlGroupMenu()", 
        status, status != PRO_TK_NO_ERROR );

    /* Define menu buttons */
    ProMenubuttonActionSet( (char*)"Group", (char*)"Create", 
        (ProMenubuttonAction)ProTestDtlGroupCreate, drawing, 0);
    ProMenubuttonActionSet( (char*)"Group", (char*)"Suppress", 
        (ProMenubuttonAction)ProTestDtlGroupSuppress, drawing, 0);
    ProMenubuttonActionSet( (char*)"Group", (char*)"Resume", 
        (ProMenubuttonAction)ProTestDtlGroupResume, drawing, 0);
    ProMenubuttonActionSet( (char*)"Group", (char*)"Explode", 
        (ProMenubuttonAction)ProTestDtlGroupExplode, drawing, 0);
    ProMenubuttonActionSet( (char*)"Group", (char*)"Edit", 
        (ProMenubuttonAction)ProTestDtlGroupEditMenu, drawing, 0 );
    ProMenubuttonActionSet( (char*)"Group", (char*)"List", 
        (ProMenubuttonAction)ProTestDtlGroupList, drawing, 0 );
    ProMenubuttonActionSet( (char*)"Group", (char*)"Group", 
        (ProMenubuttonAction)ProMenuDelete, NULL, 0 );


    /*--------------------------*\
    Run menu Disp List
    \*--------------------------*/
    status = ProMenuCreate( PROMENUTYPE_MAIN, (char*)"Group", &menu_id );
    TEST_CALL_REPORT( "ProMenuCreate()", "ProTestDtlGroupMenu()", 
        status, status != PRO_TK_NO_ERROR );
    if( status == PRO_TK_NO_ERROR )
    {
        status = ProMenuProcess( (char*)"Group", &action );
        TEST_CALL_REPORT( "ProMenuProcess()", "ProTestDtlGroupMenu()", 
            status, status != PRO_TK_NO_ERROR && status != PRO_TK_E_FOUND);
    }

    return 0;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupSelectMenu()
    Purpose:    selection menu
    Returns:    0 - success; -1 - error or selection canceled
\*---------------------------------------------------------------------*/
int ProTestDtlGroupSelectMenu (
    ProDrawing drawing, 
    ProDtlgroup*    p_group)
{
    ProError err = PRO_TK_NO_ERROR;
    wchar_t **menu_strs;
    int action, status;

    err = ProUtilMenuStringsAlloc (&menu_strs);
    err = ProUtilMenuStringsStrAdd (&menu_strs, (char*)"Select");
    err = ProUtilMenuStringsStrAdd (&menu_strs, (char*)"By Name");
    
    err = ProUtilMenuStringsIntValueSelect ((char*)"SelectGroup", menu_strs, &action);
    if (err != PRO_TK_NO_ERROR)
        return -1;

    err = ProUtilMenuStringsFree (&menu_strs);
    
    if (action == 0)
        status = ProTestDtlGroupSelect (drawing, p_group);
    else if (action == 1)
        status = ProTestDtlGroupSelectByName (drawing, p_group);
    else
        status = -1;

    return status;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupSelectByName()
    Purpose:    selection menu
    Returns:    0 - success; -1 - error or selection canceled
\*---------------------------------------------------------------------*/
int ProTestDtlGroupSelectByName (
    ProDrawing drawing, 
    ProDtlgroup* p_group)
{
    ProError err = PRO_TK_NO_ERROR;
    wchar_t **menu_strs;
    ProDtlgroup *p_groups;
    ProDtlgroupdata group_data;
    ProName name;
    int action = -1, group_num = 0, i = 0, sheet = -1;

    err = ProDrawingCurrentSheetGet (drawing, &sheet);
    TEST_CALL_REPORT ("ProDrawingCurrentSheetGet()", "ProTestDtlGroupSelectByName()",
        err, err != PRO_TK_NO_ERROR);

    err = ProDrawingDtlgroupsCollect (drawing, sheet, &p_groups); 
    TEST_CALL_REPORT ("ProDrawingDtlgroupsCollect()", "ProTestDtlGroupSelectByName()",
        err, err != PRO_TK_NO_ERROR && err != PRO_TK_E_NOT_FOUND);
    if (err != PRO_TK_NO_ERROR)
        return -1;

    ProArraySizeGet (p_groups, &group_num);

    err = ProUtilMenuStringsAlloc (&menu_strs);

    for (i = 0; i < group_num; i++)
    {
        err = ProDtlgroupDataGet (&p_groups[i], &group_data);
        TEST_CALL_REPORT ("ProDtlgroupDataGet()", "ProTestDtlGroupSelectByName()",
            err, err != PRO_TK_NO_ERROR);
        if (err != PRO_TK_NO_ERROR)
            return -1;
        err = ProDtlgroupdataNameGet (group_data, name);
        TEST_CALL_REPORT ("ProDtlgroupdataNameGet()", "ProTestDtlGroupSelectByName()",
            err, err != PRO_TK_NO_ERROR);

        err = ProUtilMenuStringsWstrAdd (&menu_strs, name);

        err = ProDtlgroupdataFree (group_data);
        TEST_CALL_REPORT ("ProDtlgroupdataFree()", "ProTestDtlGroupSelectByName()",
            err, err != PRO_TK_NO_ERROR);
    }

    err = ProUtilMenuStringsIntValueSelect ((char*)"SelectGroup", menu_strs, &action);
    if (err != PRO_TK_NO_ERROR)
        return -1;

    err = ProUtilMenuStringsFree (&menu_strs);

    memcpy (p_group, &p_groups[action], sizeof (ProDtlgroup));

    ProArrayFree ((ProArray*)&p_groups);

    return 0;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupList()
    Purpose:    Prints info about all groups for qcr comporison
    Returns:    0 - success; -1 - error
\*---------------------------------------------------------------------*/
int ProTestDtlGroupList (void* app_data, int int_dummy)
{
    ProDrawing drawing = (ProDrawing)app_data;
    ProError err = PRO_TK_NO_ERROR;
    ProDtlgroup *p_groups;
    ProDtlgroupdata group_data;
    ProDtlitem *p_group_items;
    ProName name;
    char info_file_name[] = "group_info.txt", str[PRO_NAME_SIZE];
    FILE *fptr;
    int group_num = 0, i = 0, j = 0, sheet = -1, id = -1, items_num;

    err = ProDrawingCurrentSheetGet (drawing, &sheet);
    TEST_CALL_REPORT ("ProDrawingCurrentSheetGet()", "ProTestDtlGroupList()",
        err, err != PRO_TK_NO_ERROR);

    err = ProDrawingDtlgroupsCollect (drawing, sheet, &p_groups); 
    TEST_CALL_REPORT ("ProDrawingDtlgroupsCollect()", "ProTestDtlGroupList()",
        err, err != PRO_TK_NO_ERROR && err != PRO_TK_E_NOT_FOUND);

    ProArraySizeGet (p_groups, &group_num);

    if ((fptr = PTApplsUnicodeFopen (info_file_name, "w")) == NULL)
    {
        ProUtilMsgPrint ("gen", "TEST %0s", "Can't open info file for writing");
        return -1;
    }

    for (i = 0; i < group_num; i++)
    {
        err = ProDtlgroupDataGet(&p_groups[i], &group_data);
        TEST_CALL_REPORT ("ProDtlgroupDataGet()", "ProTestDtlGroupList()",
            err, err != PRO_TK_NO_ERROR);

        err = ProDtlgroupdataNameGet (group_data, name);
        TEST_CALL_REPORT ("ProDtlgroupdataNameGet()", "ProTestDtlGroupList()",
            err, err != PRO_TK_NO_ERROR);
        ProWstringToString (str, name);

        err = ProDtlgroupdataIdGet (group_data, &id);
        TEST_CALL_REPORT ("ProDtlgroupdataIdGet()", "ProTestDtlGroupList()",
            err, err != PRO_TK_NO_ERROR);

        ProTKFprintf (fptr, "\nGroup name: %s\nGroup Id: %d\n", str, id);
        
        err = ProDtlgroupdataItemsCollect (group_data, &p_group_items);
        TEST_CALL_REPORT ("ProDtlgroupdataItemsCollect()", "ProTestDtlGroupList()",
            err, err != PRO_TK_NO_ERROR && err != PRO_TK_E_NOT_FOUND);

        ProArraySizeGet (p_group_items, &items_num);
        
        ProTKFprintf (fptr, "hold %d items:\n", items_num);
        
        for (j = 0; j < items_num; j++)
        {
            switch (p_group_items[j].type)
            {
            case PRO_NOTE:
                ProTKFprintf (fptr, "PRO_NOTE\n");
                break;
            case PRO_DRAFT_ENTITY:
                ProTKFprintf (fptr, "PRO_DRAFT_ENTITY\n");
                break;
            case PRO_SYMBOL_INSTANCE:
                ProTKFprintf (fptr, "PRO_SYMBOL_INSTANCE\n");
                break;
            default:
                ProTKFprintf (fptr, "Unknown type %d\n", p_group_items[j].type);
                break;
            }
        }

        ProArrayFree ((ProArray*)&p_group_items);

        err = ProDtlgroupdataFree (group_data);
        TEST_CALL_REPORT ("ProDtlgroupdataFree()", "ProTestDtlGroupList()",
            err, err != PRO_TK_NO_ERROR);
    }

    ProArrayFree ((ProArray*)&p_groups);

    fclose (fptr);
    
    err = ProInfoWindowDisplay (ProStringToWstring (name, info_file_name), 
        NULL, NULL);
    TEST_CALL_REPORT ("ProInfoWindowDisplay()", "ProTestDtlGroupList()",
        err, err != PRO_TK_NO_ERROR);
            
    return 0;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupSelect()
    Purpose:    selects dtlgroup
    Returns:    0 - success; -1 - error or selection canceled
\*---------------------------------------------------------------------*/
int ProTestDtlGroupSelect (
    ProDrawing        drawing,
    ProDtlgroup*    p_group)            /*in: ProDtlgroup*/
{
    int group_num = 0, n_sel = 0, i = 0, j = 0,
        sheet = -1, items_num;
    ProDtlitem group_item, *p_group_items;
    ProDtlgroup *p_groups;
    ProDtlgroupdata group_data;
    ProSelection *p_sel = NULL;
    ProError err = PRO_TK_NO_ERROR;
    
    if (p_group == NULL)
        return -1;

    err = ProDrawingCurrentSheetGet (drawing, &sheet);
    TEST_CALL_REPORT ("ProDrawingCurrentSheetGet()", "ProTestDtlGroupSelect()",
        err, err != PRO_TK_NO_ERROR);

    err = ProDrawingDtlgroupsCollect (drawing, sheet, &p_groups); 
    TEST_CALL_REPORT ("ProDrawingDtlgroupsCollect()", "ProTestDtlGroupSelect()",
        err, err != PRO_TK_NO_ERROR && err != PRO_TK_E_NOT_FOUND);

    err = ProArraySizeGet (p_groups, &group_num);
    TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestDtlGroupSelect()",
            err, err != PRO_TK_NO_ERROR);

    while (1)
    {
    ProUtilMsgPrint ("gen", "TEST %0s", "Select group" );
    err = ProSelect ((char*)"any_note,draft_ent,dtl_symbol", 1, 
        NULL, NULL, NULL, NULL, &p_sel, &n_sel);
    TEST_CALL_REPORT ("ProSelect()", "ProTestDtlGroupSelect()",
        err, err != PRO_TK_NO_ERROR);
    
    if (err != PRO_TK_NO_ERROR || n_sel < 1)
        return -1;

    err = ProSelectionModelitemGet (p_sel[0], &group_item);
    TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestDtlGroupSelect()",
        err, err != PRO_TK_NO_ERROR);

    for (i = 0; i < group_num; i++)
    {
        err = ProDtlgroupDataGet(&p_groups[0], &group_data);
        TEST_CALL_REPORT ("ProDtlgroupDataGet()", "ProTestDtlGroupSelect()",
            err, err != PRO_TK_NO_ERROR);

        err = ProDtlgroupdataItemsCollect (group_data, &p_group_items);
        TEST_CALL_REPORT ("ProDtlgroupdataItemsCollect()", "ProTestDtlGroupSelect()",
            err, err != PRO_TK_NO_ERROR && err != PRO_TK_E_NOT_FOUND);

        err = ProArraySizeGet (p_group_items, &items_num);
        TEST_CALL_REPORT ("ProArraySizeGet()", "ProTestDtlGroupSelect()",
            err, err != PRO_TK_NO_ERROR);

        for (j = 0; j < items_num; j++)
        {
            if (ProTestDtlitemsCompare (&group_item, &p_group_items[j]) == 0)
                break;
        }

        err = ProArrayFree ((ProArray*)&p_group_items);
        TEST_CALL_REPORT ("ProArrayFree()", "ProTestDtlGroupSelect()",
            err, err != PRO_TK_NO_ERROR);

        err = ProDtlgroupdataFree (group_data);
        TEST_CALL_REPORT ("ProDtlgroupdataFree()", "ProTestDtlGroupSelect()",
            err, err != PRO_TK_NO_ERROR);

        if (j != items_num)
            break;
    }
    if (i != group_num)
        break;
    ProUtilMsgPrint ("gen", "TEST %0s", "This item is not a group item" );
    }
        
    memcpy (p_group, &p_groups[i], sizeof (ProDtlgroup));

    err = ProArrayFree ((ProArray*)&p_groups);
    TEST_CALL_REPORT ("ProArrayFree()", "ProTestDtlGroupSelect()",
            err, err != PRO_TK_NO_ERROR);
    
    return 0;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupCreate()
    Purpose:    creates dtlgroup
    Returns:    0 - success; -1 - error.
\*---------------------------------------------------------------------*/
int ProTestDtlGroupCreate (void* app_data, int int_dummy)
{
    ProDrawing drawing = (ProDrawing)app_data;
    ProSelection *p_sel = NULL;
    ProDtlgroupdata group_data;
    ProDtlgroup group;
    ProDtlitem group_item;
    ProName name, default_name;
    int i = 0, n_sel;
    ProError err = PRO_TK_NO_ERROR;

    ProStringToWstring (default_name, (char*)"group");
    ProUtilMsgPrint ("gen", "TEST %0s", "Enter group name:" );
    ProUtilStringGet (name, default_name, PRO_NAME_SIZE);

    ProUtilMsgPrint ("gen", "TEST %0s", "Select note, entity or symbol" );
    
    err = ProSelect ((char*)"any_note,draft_ent,dtl_symbol", -1, NULL, NULL, NULL, 
        NULL, &p_sel, &n_sel);
    TEST_CALL_REPORT ("ProSelect()", "ProTestDtlGroupCreate()",
        err, err != PRO_TK_NO_ERROR);
        
    if (err != PRO_TK_NO_ERROR || n_sel < 1)
        return -1;

    err = ProDtlgroupdataAlloc (drawing, name, &group_data);
    TEST_CALL_REPORT ("ProDtlgroupdataAlloc()", "ProTestDtlGroupCreate()",
        err, err != PRO_TK_NO_ERROR);

    for (i = 0; i < n_sel; i++)
    {
        err = ProSelectionModelitemGet (p_sel[i], &group_item);
        TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestDtlGroupCreate()",
            err, err != PRO_TK_NO_ERROR);

        err = ProDtlgroupdataItemAdd (group_data, &group_item);
        TEST_CALL_REPORT ("ProDtlgroupdataItemAdd()", "ProTestDtlGroupCreate()",
            err, err != PRO_TK_NO_ERROR);
    }

    err = ProDtlgroupCreate (drawing, group_data, &group);
    TEST_CALL_REPORT ("ProDtlgroupCreate()", "ProTestDtlGroupCreate()",
        err, err != PRO_TK_NO_ERROR);

    err = ProDtlgroupdataFree (group_data);
    TEST_CALL_REPORT ("ProDtlgroupdataFree()", "ProTestDtlGroupCreate()",
        err, err != PRO_TK_NO_ERROR);

    return 0;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupSuppress()
    Purpose:    suppresses dtlgroup
    Returns:    0 - success; -1 - error.
\*---------------------------------------------------------------------*/
int  ProTestDtlGroupSuppress (void* app_data, int int_dummy)
{
    ProDrawing drawing = (ProDrawing)app_data;
    ProDtlgroup group;
    ProError err = PRO_TK_NO_ERROR;

    if (ProTestDtlGroupSelectMenu (drawing, &group) == -1)
        return -1;
    
    err = ProDtlgroupErase (&group);
    TEST_CALL_REPORT ("ProDtlgroupErase()", "ProTestDtlGroupSuppress()",
        err, err != PRO_TK_NO_ERROR);

    return 0;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupResume()
    Purpose:    resume dtlgroup
    Returns:    0 - success; -1 - error.
\*---------------------------------------------------------------------*/
int ProTestDtlGroupResume (void* app_data, int int_dummy)
{
    ProDrawing drawing = (ProDrawing)app_data;
    ProDtlgroup group;
    ProError err = PRO_TK_NO_ERROR;

    if (ProTestDtlGroupSelectMenu (drawing, &group) == -1)
        return -1;
    
    err = ProDtlgroupDraw (&group);
    TEST_CALL_REPORT ("ProDtlgroupDraw()", "ProTestDtlGroupResume()",
        err, err != PRO_TK_NO_ERROR);

    return 0;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupExplode()
    Purpose:    Explode dtlgroup
    Returns:    0 - success; -1 - error.
\*---------------------------------------------------------------------*/
int ProTestDtlGroupExplode (void* app_data, int int_dummy)
{
    ProDrawing drawing = (ProDrawing)app_data;
    ProDtlgroup group;
    ProError err = PRO_TK_NO_ERROR;

    if (ProTestDtlGroupSelectMenu (drawing, &group) == -1)
        return -1;
    
    err = ProDtlgroupDelete (&group);
    TEST_CALL_REPORT ("ProDtlgroupDelete()", "ProTestDtlGroupExplode()",
        err, err != PRO_TK_NO_ERROR);

    return 0;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupEditMenu()
    Purpose:    Menu for edititing
    Returns:    0 - success; -1 - error.
\*---------------------------------------------------------------------*/
int ProTestDtlGroupEditMenu (void* app_data, int int_dummy)
{
    ProDrawing drawing = (ProDrawing)app_data;
    int            menu_id;   
    int            action;
    ProError    err = PRO_TK_NO_ERROR;

    err = ProMenuFileRegister( (char*)"Edit", (char*)"tkdtlgroupedit.mnu", &menu_id );
    TEST_CALL_REPORT( "ProMenuFileRegister()", "ProTestDtlEditMenu()", 
            err, err != PRO_TK_NO_ERROR );

    /* Define menu buttons */
    ProMenubuttonActionSet( (char*)"Edit", (char*)"Add", 
        (ProMenubuttonAction)ProTestDtlGroupEdit, drawing, GRP_EDIT_ADD);
    ProMenubuttonActionSet( (char*)"Edit", (char*)"Remove", 
        (ProMenubuttonAction)ProTestDtlGroupEdit, drawing, GRP_EDIT_REMOVE);
    ProMenubuttonActionSet( (char*)"Edit", (char*)"Edit", 
        (ProMenubuttonAction)ProMenuDelete, NULL, 0 );

    /*--------------------------*\
    Run menu Disp List
    \*--------------------------*/
    err = ProMenuCreate( PROMENUTYPE_MAIN, (char*)"Edit", &menu_id );
    TEST_CALL_REPORT( "ProMenuCreate()", "ProTestDtlEditMenu()", 
        err, err != PRO_TK_NO_ERROR );
    if( err == PRO_TK_NO_ERROR )
    {
        err = ProMenuProcess( (char*)"Edit", &action );
        TEST_CALL_REPORT( "ProMenuProcess()", "ProTestDtlEditMenu()", 
            err, err != PRO_TK_NO_ERROR && err != PRO_TK_E_FOUND);
    }

    return 0;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlitemsCompare()
    Purpose:    Compares two dtlitems
    Returns:    0 - success; -1 - error.
\*---------------------------------------------------------------------*/
int ProTestDtlitemsCompare (ProDtlitem *item1, ProDtlitem *item2)
{
    if (item1->type != item2->type)
        return -1;
    return (item1->id == item2->id)? 0 : -1;
}

/*---------------------------------------------------------------------*\
    Function:    ProTestDtlGroupEdit()
    Purpose:    Edit
    Returns:    0 - success; -1 - error.
\*---------------------------------------------------------------------*/
int ProTestDtlGroupEdit (void* app_data, int action)
{
    ProDrawing drawing = (ProDrawing)app_data;
    ProDtlgroup group;
    ProDtlgroupdata group_data;
    ProDtlitem *p_group_items, group_item;
    ProError err = PRO_TK_NO_ERROR;
    ProSelection *p_sel = NULL;
    int items_num = 0, i = 0, j = 0, n_sel;

    if (ProTestDtlGroupSelectMenu (drawing, &group) == -1)
        return -1;

    err = ProDtlgroupDataGet (&group, &group_data);
    TEST_CALL_REPORT ("ProDtlgroupDataGet()", "ProTestDtlGroupEdit()",
        err, err != PRO_TK_NO_ERROR);
    err = ProDtlgroupdataItemsCollect (group_data, &p_group_items);
    TEST_CALL_REPORT ("ProDtlgroupdataItemsCollect()", "ProTestDtlGroupEdit()",
        err, err != PRO_TK_NO_ERROR && err != PRO_TK_E_NOT_FOUND);

    err = ProArraySizeGet (p_group_items, &items_num);

    ProUtilMsgPrint ("gen", "TEST %0s", "Select draft items" );
    err = ProSelect ((char*)"any_note,draft_ent,dtl_symbol", -1, NULL, NULL, NULL, 
        NULL, &p_sel, &n_sel);
    TEST_CALL_REPORT ("ProSelect()", "ProTestDtlGroupEdit()",
            err, err != PRO_TK_NO_ERROR);
        
    if (err != PRO_TK_NO_ERROR || n_sel < 1)
        return -1;

    for (i = 0; i < n_sel; i++)
    {
        err = ProSelectionModelitemGet (p_sel[i], &group_item);
        TEST_CALL_REPORT ("ProSelectionModelitemGet()", "ProTestDtlGroupEdit()",
            err, err != PRO_TK_NO_ERROR);
        for (j = 0; j < items_num; j++)
        {
            if (ProTestDtlitemsCompare (&group_item, &p_group_items[j]) == 0)
                break;
        }
        /*item is found*/
        if ((j != items_num) && (action == GRP_EDIT_REMOVE))
        {
            err = ProArrayObjectRemove ((ProArray*)&p_group_items, j, 1);
            TEST_CALL_REPORT ("ProArrayObjectRemove()", "ProTestDtlGroupEdit()",
                err, err != PRO_TK_NO_ERROR);
            ProArraySizeGet (p_group_items, &items_num);
        }
        /*item is not found*/
        else if ((j == items_num) && (action == GRP_EDIT_ADD))
        {
            ProArrayObjectAdd ((ProArray*)&p_group_items, 
                PRO_VALUE_UNUSED, 1, &group_item);
            TEST_CALL_REPORT ("ProArrayObjectAdd()", "ProTestDtlGroupEdit()",
                err, err != PRO_TK_NO_ERROR);
            ProArraySizeGet (p_group_items, &items_num);
        }
    }

    err = ProDtlgroupdataItemsSet (group_data, p_group_items);
    TEST_CALL_REPORT ("ProDtlgroupdataItemsSet()", "ProTestDtlGroupEdit()",
        err, err != PRO_TK_NO_ERROR);
    err = ProDtlgroupModify (&group, group_data);
    TEST_CALL_REPORT ("ProDtlgroupModify()", "ProTestDtlGroupEdit()",
        err, err != PRO_TK_NO_ERROR);

    err = ProDtlgroupdataFree (group_data);
    TEST_CALL_REPORT ("ProDtlgroupdataFree()", "ProTestDtlGroupEdit()",
        err, err != PRO_TK_NO_ERROR);

    return 0;
}