blob: 0b793f37168f0b3a7ad28843f5bca581dfde64be [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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
*
*******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.refactor.structure;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.ParticipantManager;
import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
import org.eclipse.ltk.core.refactoring.participants.RenameArguments;
import org.eclipse.ltk.core.refactoring.participants.RenameProcessor;
import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
import org.eclipse.wst.xsd.ui.internal.refactor.INameUpdating;
import org.eclipse.wst.xsd.ui.internal.refactor.RefactoringMessages;
import org.eclipse.xsd.XSDTypeDefinition;
public class MakeTypeGlobalProcessor extends RenameProcessor implements INameUpdating{
private XSDTypeDefinition fTypeComponent;
private String fNewElementName;
public static final String IDENTIFIER= "org.eclipse.wst.ui.xsd.makeTypeGlobalProcessor"; //$NON-NLS-1$
//private QualifiedNameSearchResult fNameSearchResult;
public MakeTypeGlobalProcessor(XSDTypeDefinition element, String newName) {
fTypeComponent= element;
fNewElementName = newName;
}
public XSDTypeDefinition getTypeComponent() {
return fTypeComponent;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.tagging.ITextUpdating#canEnableTextUpdating()
*/
public boolean canEnableTextUpdating() {
return true;
}
protected String[] getAffectedProjectNatures() throws CoreException {
//TODO: find project natures of the files that are going to be refactored
return new String[0];
}
protected void loadDerivedParticipants(RefactoringStatus status,
List result, String[] natures, SharableParticipants shared)
throws CoreException {
// TODO: provide a way to load rename participants
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#checkFinalConditions(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext)
*/
public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
CheckConditionsContext context) throws CoreException,
OperationCanceledException {
// TODO add code to check final conditions for component rename
return new RefactoringStatus();
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#checkInitialConditions(org.eclipse.core.runtime.IProgressMonitor)
*/
public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
throws CoreException, OperationCanceledException {
// TODO add code to check initial conditions for component rename
return new RefactoringStatus();
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#createChange(org.eclipse.core.runtime.IProgressMonitor)
*/
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
// TODO P1 add change creation
// Change[] changes = XSDComponentRenameChange.createChangesFor(this.fNamedComponent, getNewElementName());
// CompositeChange multiChange = null;
// if(changes.length > 0)
// multiChange = new CompositeChange("XSD component rename participant changes", changes); //$NON-NLS-1$ TODO: externalize string
// return multiChange;
// computeNameMatches(pm);
// Change[] changes = fNameSearchResult.getAllChanges();
// return new CompositeChange("XSD file rename participant changes", changes); //TODO: externalize string
pm.beginTask("", 1); //$NON-NLS-1$
try{
return new MakeTypeGlobalChange(fTypeComponent, getNewElementName());
} finally{
pm.done();
}
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#getElements()
*/
public Object[] getElements() {
return new Object[] {fTypeComponent};
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#getIdentifier()
*/
public String getIdentifier() {
return IDENTIFIER;
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#getProcessorName()
*/
public String getProcessorName() {
return RefactoringMessages.getFormattedString(
"MakeLocalTypeGlobalRefactoring.name", //$NON-NLS-1$
new String[]{getNewElementName()});
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#isApplicable()
*/
public boolean isApplicable() throws CoreException {
if (fTypeComponent == null)
return false;
// TODO implement isApplicable logic for the named component,
// verify how it is different from other condition checks
// if (fNamedComponent.isAnonymous())
// return false;
// if (! Checks.isAvailable(fType))
// return false;
// if (isSpecialCase(fType))
// return false;
return true;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.tagging.INameUpdating#checkNewElementName(java.lang.String)
*/
public RefactoringStatus checkNewElementName(String newName){
Assert.isNotNull(newName, "new name"); //$NON-NLS-1$
// TODO: implement new name checking
// RefactoringStatus result = Checks.checkTypeName(newName);
// if (Checks.isAlreadyNamed(fType, newName))
// result.addFatalError(RefactoringCoreMessages.getString("RenameTypeRefactoring.choose_another_name")); //$NON-NLS-1$
return new RefactoringStatus();
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.corext.refactoring.tagging.INameUpdating#getNewElement()
*/
public Object getNewElement() throws CoreException {
// TODO implement this method, it's used for updating selection on new element
return null;
}
// private void computeNameMatches(IProgressMonitor pm) throws CoreException {
//
// IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
// try {
// URL fileURL = Platform.resolve(new URL(fNamedComponent.getSchema().getSchemaLocation()));
// IFile file = workspaceRoot.getFileForLocation(new Path(fileURL.getPath()));
// if (fNameSearchResult == null)
// fNameSearchResult= new QualifiedNameSearchResult();
// QualifiedNameFinder.process(fNameSearchResult, getNamedComponent().getName(),
// getNewElementName(),
// "*.xsd", file.getProject(), pm);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
public final RefactoringParticipant[] loadParticipants(RefactoringStatus status, SharableParticipants sharedParticipants) throws CoreException {
RenameArguments arguments= new RenameArguments(getNewElementName(), true);
String[] natures= getAffectedProjectNatures();
List result= new ArrayList();
loadElementParticipants(status, result, arguments, natures, sharedParticipants);
loadDerivedParticipants(status, result, natures, sharedParticipants);
return (RefactoringParticipant[])result.toArray(new RefactoringParticipant[result.size()]);
}
protected void loadElementParticipants(RefactoringStatus status, List result, RenameArguments arguments, String[] natures, SharableParticipants shared) throws CoreException {
Object[] elements= getElements();
for (int i= 0; i < elements.length; i++) {
result.addAll(Arrays.asList(ParticipantManager.loadRenameParticipants(status,
this, elements[i],
arguments, natures, shared)));
}
}
public void setNewElementName(String newName) {
fNewElementName= newName;
}
public String getNewElementName() {
return fNewElementName;
}
public String getCurrentElementName() {
// TODO Auto-generated method stub
return fNewElementName;
}
}