Показать сообщение отдельно
Старый 13.08.2009, 18:57   #12  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Доработал вариант Denicce под себя: нужно, чтобы неизмененные объекты удалялись из дерева, а оставались только содержащие изменения.

Соответственно, вместо \Classes\SysImportElements\markDifferentObjects предлагается \Classes\SysImportElements\deleteEqualObjects:
X++:
public void deleteEqualObjects(FormTreeControl _ftc)
{
    FormTreeControl     treeControl = _ftc;
    FormTreeItem        treeItem;
    Set                 itemIdxSet = new Set(Types::Integer);

    void deleteNodeWithEmptyParents(FormTreeItem  _treeItem)
    {
        TreeItemIdx         idx;
        TreeItemIdx         childIdx;
        int                 i;
        boolean             parentIsEmpty;

        if (_treeItem)
        {
            idx = _treeItem.idx();
            itemIdxSet.add(idx);
            while select forUpdate firstonly tmpImportAot
                where tmpImportAot.TreeNodePath == _treeItem.data()
            {
                tmpImportAot.Import = false;
                tmpImportAot.update();
            }
            parentIsEmpty = true;
            childIdx = treeControl.getChild(treeControl.getParent(idx));
            while (childIdx)
            {
                if (!itemIdxSet.in(childIdx))
                {
                    parentIsEmpty = false;
                    break;
                }
                childIdx = treeControl.getNextSibling(childIdx);
            }
            if (parentIsEmpty)
                deleteNodeWithEmptyParents(treeControl.getItem(treeControl.getParent(idx)));
        }
    }


    itemIdxSet = new Set(Types::Integer);

    treeItem = treeControl.getItem(treeControl.getRoot());
    if (treeItem)
    {
        SysFormTreeControl::expandTree(treeControl, treeItem.idx());
        while (treeItem)
        {
            // KDV анализируем только конечные узлы дерева (листы - объекты АОТ):
            if (! strFind(treeItem.data(), '\\', strLen(treeItem.data()), -1))
            {
                // KDV сравниваем последний слой в АОТ и слой XPO:
                if (this.compareNodes(treeControl, treeItem))
                    deleteNodeWithEmptyParents(treeItem);

            }
            treeItem = treeControl.getItem(treeControl.getNextVisible(treeItem.idx()));
        }
        SysFormTreeControl::deleteTreeItem(treeControl, itemIdxSet);
    }
}
ну и соотв. образом подменить вызов исходного метода на мой.
__________________
Андрей.

Последний раз редактировалось Dron AKA andy; 25.08.2009 в 12:14.
За это сообщение автора поблагодарили: Small Den (1), Denicce (1), gl00mie (3),  (1).