/* ReorderGraphicsChange.m
 *
 * Copyright (C) 1993-2002 by vhf interservice GmbH
 * Authors:  Georg Fleischmann
 *
 * created:  1993
 * modified: 2002-07-15
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the vhf Public License as
 * published by vhf interservice GmbH. Among other things, the
 * License requires that the copyright notices and this notice
 * be preserved on all copies.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the vhf Public License for more details.
 *
 * You should have received a copy of the vhf Public License along
 * with this program; see the file LICENSE. If not, write to vhf.
 *
 * vhf interservice GmbH, Im Marxle 3, 72119 Altingen, Germany
 * eMail: info@vhf.de
 * http://www.vhf.de
 */

#include "undo.h"

@interface ReorderGraphicsChange(PrivateMethods)

- (void)undoDetails;

@end

@implementation ReorderGraphicsChange

- (void)saveBeforeChange
{
    [super saveBeforeChange];
    [changeDetails makeObjectsPerformSelector:@selector(recordGraphicPositionIn:) withObject:[graphicView layerList]]; 
}

- (Class)changeDetailClass
{
    return [OrderChangeDetail class];
}

- (void)undoDetails
{   id		detail = nil, graphic;
    NSArray	*layList = [graphicView layerList];
    int		count, i, l, sCnt = [layList count];

    count = [changeDetails count];
    for (i = 0; i < count; i++)
    {
	detail = [changeDetails objectAtIndex:i];
	graphic = [detail graphic];
        for ( l=0; l<sCnt; l++ )
        {   LayerObject	*layerObject = [layList objectAtIndex:l];

            if ( [[layerObject list] containsObject:graphic] )
            {   [layerObject removeObject:graphic];
                [detail setLayer:l];
            }
        }
    }
    for (i = 0; i < count; i++)
    {   LayerObject	*layerObject = [layList objectAtIndex:[detail layer]];

	detail = [changeDetails objectAtIndex:i];
	graphic = [detail graphic];
        // graphic position can be larger than list count because slaylist is sorted different (with selection)
        [layerObject insertObject:graphic atIndex:Min([detail graphicPosition], [[layerObject list] count])];
    }
}

@end
