/** * <copyright> * * Copyright (c) 2009 BestSolution.at and others. * 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: * Tom Schindl <tom.schindl@bestsolution.at> - Initial API and implementation (bug 262160) * </copyright> * * $Id: EMFEditListProperty.java,v 1.4 2010/03/01 11:57:10 emerks Exp $ */ package org.eclipse.emf.databinding.edit.internal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.core.databinding.observable.list.ListDiff; import org.eclipse.core.databinding.observable.list.ListDiffVisitor; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.databinding.internal.EMFListProperty; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.emf.edit.command.MoveCommand; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.emf.edit.command.ReplaceCommand; import org.eclipse.emf.edit.domain.EditingDomain; /** * <p><b>PROVISIONAL:</b> This API is subject to arbitrary change, including renaming or removal.</p> * * @since 2.5 */ public class EMFEditListProperty extends EMFListProperty { private final EditingDomain editingDomain; /** * @param editingDomain * @param eStructuralFeature */ public EMFEditListProperty(EditingDomain editingDomain, EStructuralFeature eStructuralFeature) { super(eStructuralFeature); this.editingDomain = editingDomain; } @SuppressWarnings("rawtypes") @Override protected void doSetList(Object source, List list, ListDiff diff) { final ListVisitorImpl visitor = new ListVisitorImpl((EObject)source, getFeature()); diff.accept(visitor); editingDomain.getCommandStack().execute (new CompoundCommand() { protected int index = 0; @Override protected boolean prepare() { for (int size = visitor.commands.size(); index < size; ++index) { if (visitor.commands.get(index).canExecute()) { return true; } } return false; } @Override public void execute() { for (int size = visitor.commands.size(); index < size; ++index) { appendAndExecute(visitor.commands.get(index)); } } }); } private class ListVisitorImpl extends ListDiffVisitor { private EObject eObj; private EStructuralFeature feature; protected final List<Command> commands = new ArrayList<Command>(); private ListVisitorImpl(EObject eObj, EStructuralFeature feature) { this.eObj = eObj; this.feature = feature; } @Override public void handleAdd(int index, Object element) { commands.add(AddCommand.create(editingDomain, eObj, feature, element, index)); } @Override public void handleMove(int oldIndex, int newIndex, Object element) { commands.add(MoveCommand.create(editingDomain, eObj, feature, element, newIndex)); } @Override public void handleReplace(int index, Object oldElement, Object newElement) { commands.add(ReplaceCommand.create(editingDomain, eObj, feature, oldElement, Collections.singleton(newElement))); } @Override public void handleRemove(int index, Object element) { commands.add(RemoveCommand.create(editingDomain, eObj, feature, element)); } } }