1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.eclipse.org/org/documents/epl-v10.php 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.ide.eclipse.adt.internal.refactorings.core; 17 18 import static com.android.SdkConstants.PREFIX_RESOURCE_REF; 19 20 import com.android.annotations.NonNull; 21 import com.android.annotations.Nullable; 22 import com.android.ide.eclipse.adt.AdtConstants; 23 import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator; 24 import com.android.resources.ResourceType; 25 26 import org.eclipse.core.resources.IProject; 27 import org.eclipse.core.runtime.CoreException; 28 import org.eclipse.core.runtime.IProgressMonitor; 29 import org.eclipse.ltk.core.refactoring.Change; 30 import org.eclipse.ltk.core.refactoring.RefactoringStatus; 31 import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; 32 import org.eclipse.ltk.core.refactoring.participants.ParticipantManager; 33 import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant; 34 import org.eclipse.ltk.core.refactoring.participants.RenameArguments; 35 import org.eclipse.ltk.core.refactoring.participants.RenameProcessor; 36 import org.eclipse.ltk.core.refactoring.participants.SharableParticipants; 37 38 /** 39 * A rename processor for Android resources. 40 */ 41 public class RenameResourceProcessor extends RenameProcessor { 42 private IProject mProject; 43 private ResourceType mType; 44 private String mCurrentName; 45 private String mNewName; 46 private boolean mUpdateReferences = true; 47 private ResourceNameValidator mValidator; 48 private RenameArguments mRenameArguments; 49 50 /** 51 * Creates a new rename resource processor. 52 * 53 * @param project the project containing the renamed resource 54 * @param type the type of the resource 55 * @param currentName the current name of the resource 56 * @param newName the new name of the resource, or null if not known 57 */ 58 public RenameResourceProcessor( 59 @NonNull IProject project, 60 @NonNull ResourceType type, 61 @NonNull String currentName, 62 @Nullable String newName) { 63 mProject = project; 64 mType = type; 65 mCurrentName = currentName; 66 mNewName = newName != null ? newName : currentName; 67 mUpdateReferences= true; 68 mValidator = ResourceNameValidator.create(false, mProject, mType); 69 } 70 71 /** 72 * Returns the project containing the renamed resource 73 * 74 * @return the project containing the renamed resource 75 */ 76 @NonNull 77 public IProject getProject() { 78 return mProject; 79 } 80 81 /** 82 * Returns the new resource name 83 * 84 * @return the new resource name 85 */ 86 @NonNull 87 public String getNewName() { 88 return mNewName; 89 } 90 91 /** 92 * Returns the current name of the resource 93 * 94 * @return the current name of the resource 95 */ 96 public String getCurrentName() { 97 return mCurrentName; 98 } 99 100 /** 101 * Returns the type of the resource 102 * 103 * @return the type of the resource 104 */ 105 @NonNull 106 public ResourceType getType() { 107 return mType; 108 } 109 110 /** 111 * Sets the new name 112 * 113 * @param newName the new name 114 */ 115 public void setNewName(@NonNull String newName) { 116 mNewName = newName; 117 } 118 119 /** 120 * Returns {@code true} if the refactoring processor also updates references 121 * 122 * @return {@code true} if the refactoring processor also updates references 123 */ 124 public boolean isUpdateReferences() { 125 return mUpdateReferences; 126 } 127 128 /** 129 * Specifies if the refactoring processor also updates references. The 130 * default behavior is to update references. 131 * 132 * @param updateReferences {@code true} if the refactoring processor should 133 * also updates references 134 */ 135 public void setUpdateReferences(boolean updateReferences) { 136 mUpdateReferences = updateReferences; 137 } 138 139 /** 140 * Checks the given new potential name and returns a {@link RefactoringStatus} indicating 141 * whether the potential new name is valid 142 * 143 * @param name the name to check 144 * @return a {@link RefactoringStatus} with the validation result 145 */ 146 public RefactoringStatus checkNewName(String name) { 147 String error = mValidator.isValid(name); 148 if (error != null) { 149 return RefactoringStatus.createFatalErrorStatus(error); 150 } 151 152 return new RefactoringStatus(); 153 } 154 155 @Override 156 public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException { 157 return new RefactoringStatus(); 158 } 159 160 @Override 161 public RefactoringStatus checkFinalConditions(IProgressMonitor pm, 162 CheckConditionsContext context) throws CoreException { 163 pm.beginTask("", 1); 164 try { 165 mRenameArguments = new RenameArguments(getNewName(), isUpdateReferences()); 166 return new RefactoringStatus(); 167 } finally { 168 pm.done(); 169 } 170 } 171 172 @Override 173 public Change createChange(IProgressMonitor pm) throws CoreException { 174 pm.beginTask("", 1); 175 try { 176 // Added by {@link RenameResourceParticipant} 177 return null; 178 } finally { 179 pm.done(); 180 } 181 } 182 183 @Override 184 public Object[] getElements() { 185 return new Object[0]; 186 } 187 188 @Override 189 public String getIdentifier() { 190 return "com.android.ide.renameResourceProcessor"; //$NON-NLS-1$ 191 } 192 193 @Override 194 public String getProcessorName() { 195 return "Rename Android Resource"; 196 } 197 198 @Override 199 public boolean isApplicable() { 200 return true; 201 } 202 203 @Override 204 public RefactoringParticipant[] loadParticipants(RefactoringStatus status, 205 SharableParticipants shared) throws CoreException { 206 String[] affectedNatures = new String[] { AdtConstants.NATURE_DEFAULT }; 207 String url = PREFIX_RESOURCE_REF + mType.getName() + '/' + mCurrentName; 208 return ParticipantManager.loadRenameParticipants(status, this, url, mRenameArguments, 209 null, affectedNatures, shared); 210 } 211 }