/*******************************************************************************
* Copyright (c) 2000, 2014 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.rename;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.IParticipantDescriptorFilter;
import org.eclipse.ltk.core.refactoring.participants.ParticipantManager;
import org.eclipse.ltk.core.refactoring.participants.RefactoringArguments;
import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
import org.eclipse.ltk.core.refactoring.participants.RenameArguments;
import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
import org.eclipse.ltk.core.refactoring.participants.ValidateEditChecker;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.model.ISourceRoot;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.corext.refactoring.participants.ResourceModifications;
import org.eclipse.cdt.internal.ui.refactoring.reorg.RefactoringModifications;
/**
* Stores objects renamed by the rename refactoring.
*/
public class RenameModifications extends RefactoringModifications {
private List<Object> fRename;
private List<RefactoringArguments> fRenameArguments;
private List<IParticipantDescriptorFilter> fParticipantDescriptorFilter;
public RenameModifications() {
fRename = new ArrayList<>();
fRenameArguments = new ArrayList<>();
fParticipantDescriptorFilter = new ArrayList<>();
}
public void rename(IBinding binding, RenameArguments args) {
add(binding, args, null);
}
public void rename(IResource resource, RenameArguments args) {
add(resource, args, null);
}
public void rename(ISourceRoot sourceFolder, RenameArguments arguments) {
add(sourceFolder, arguments, null);
if (sourceFolder.getResource() != null) {
getResourceModifications().addRename(sourceFolder.getResource(), arguments);
}
}
public void rename(ITranslationUnit unit, RenameArguments args) {
add(unit, args, null);
if (unit.getResource() != null) {
getResourceModifications().addRename(unit.getResource(), new RenameArguments(args.getNewName(), args.getUpdateReferences()));
}
}
@Override
public void buildDelta(IResourceChangeDescriptionFactory builder) {
for (int i = 0; i < fRename.size(); i++) {
Object element= fRename.get(i);
if (element instanceof IResource) {
ResourceModifications.buildMoveDelta(builder, (IResource) element,
(RenameArguments) fRenameArguments.get(i));
}
}
getResourceModifications().buildDelta(builder);
}
@Override
public void buildValidateEdits(ValidateEditChecker checker) {
for (Iterator<Object> iter = fRename.iterator(); iter.hasNext();) {
Object element = iter.next();
if (element instanceof ITranslationUnit) {
ITranslationUnit unit = (ITranslationUnit) element;
IResource resource = unit.getResource();
if (resource != null && resource.getType() == IResource.FILE) {
checker.addFile((IFile) resource);
}
}
}
}
@Override
public RefactoringParticipant[] loadParticipants(RefactoringStatus status, RefactoringProcessor owner,
String[] natures, SharableParticipants shared) {
List<RefactoringParticipant> result = new ArrayList<>();
for (int i = 0; i < fRename.size(); i++) {
ArrayUtil.addAll(result,
ParticipantManager.loadRenameParticipants(status,
owner, fRename.get(i),
(RenameArguments) fRenameArguments.get(i),
fParticipantDescriptorFilter.get(i),
natures, shared));
}
ArrayUtil.addAll(result, getResourceModifications().getParticipants(status, owner, natures, shared));
return result.toArray(new RefactoringParticipant[result.size()]);
}
private void add(Object element, RefactoringArguments args, IParticipantDescriptorFilter filter) {
Assert.isNotNull(element);
Assert.isNotNull(args);
fRename.add(element);
fRenameArguments.add(args);
fParticipantDescriptorFilter.add(filter);
}
}