/*******************************************************************************
 * Copyright (c) 2015 Soft-Maint.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Jonathan Pepin (Soft-Maint) - Bug 474418 - Edit Facet features with Properties View and Commands
 *******************************************************************************/

package org.eclipse.modisco.facet.efacet.edit.core.internal.command;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.modisco.facet.efacet.core.IFacetManager;
import org.eclipse.modisco.facet.efacet.edit.core.FacetCommandException;
import org.eclipse.modisco.facet.efacet.edit.core.internal.Messages;

/**
 * The add all command logically acts upon an owner object that has a
 * collection-based feature to which other objects can be added.
 *
 */
public class FacetAddAllCommand extends AbstractFacetCommand {

	private static final String LABEL = Messages.FacetAddAllCommand_Label;
	private static final String DESCRIPTION = Messages.FacetAddAllCommand_Descriptor;

	private final List<Object> oldValues;
	private List<Object> newValues;
	private final Collection<? extends Object> newValuesToAdd;

	public FacetAddAllCommand(final EObject owner,
			final EStructuralFeature feature,
			final Collection<? extends Object> newValues,
			final EditingDomain domain, final IFacetManager facetManager)
			throws FacetCommandException {
		super(owner, feature, domain, facetManager, LABEL, DESCRIPTION);
		this.newValuesToAdd = newValues;
		this.oldValues = getCurrentValues();
	}

	@Override
	public boolean doCanExecute() {
		return super.doCanExecute() && getFeature().isMany();
	}

	@Override
	public void doExecute() {
		this.newValues = new ArrayList<Object>(this.oldValues);
		this.newValues.addAll(this.newValuesToAdd);
		set(this.newValues);
	}

	@Override
	public void doUndo() {
		set(this.oldValues);
	}

	@Override
	public void doRedo() {
		set(this.newValues);
	}

}
