diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/RenamePackageAction.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/RenamePackageAction.java | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/RenamePackageAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/RenamePackageAction.java new file mode 100644 index 000000000..bb475aab1 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/renamepackage/RenamePackageAction.java @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.adt.internal.refactorings.renamepackage; + +import com.android.ide.common.xml.ManifestData; +import com.android.ide.eclipse.adt.AdtPlugin; +import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.Status; +import org.eclipse.jdt.core.dom.AST; +import org.eclipse.jdt.core.dom.Name; +import org.eclipse.jdt.ui.refactoring.RefactoringSaveHelper; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.IInputValidator; +import org.eclipse.jface.dialogs.InputDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.window.Window; +import org.eclipse.ltk.core.refactoring.Refactoring; +import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation; +import org.eclipse.ui.IObjectActionDelegate; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; + +import java.util.Iterator; + +/** + * Refactoring steps: + * <ol> + * <li>Update the "package" attribute of the <manifest> tag with the new + * name.</li> + * <li>Replace all values for the "android:name" attribute in the + * <application> and "component class" (<activity>, <service>, + * <receiver>, and <provider>) tags with the non-shorthand version + * of the class name</li> + * <li>Replace package resource imports (*.R) in .java files</li> + * <li>Update package name in the namespace declarations (e.g. "xmlns:app") + * used for custom styleable attributes in layout resource files</li> + * </ol> + * Caveat: Sometimes it is necessary to perform a project-wide + * "Organize Imports" afterwards. (CTRL+SHIFT+O when a project has active + * selection) + */ +public class RenamePackageAction implements IObjectActionDelegate { + + private ISelection mSelection; + @SuppressWarnings("unused") private IWorkbenchPart mTargetPart; // TODO cleanup + + /** + * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart) + */ + @Override + public void setActivePart(IAction action, IWorkbenchPart targetPart) { + mTargetPart = targetPart; + } + + @Override + public void selectionChanged(IAction action, ISelection selection) { + mSelection = selection; + } + + /** + * @see IWorkbenchWindowActionDelegate#init + */ + public void init(IWorkbenchWindow window) { + // pass + } + + @Override + public void run(IAction action) { + + // Prompt for refactoring on the selected project + if (mSelection instanceof IStructuredSelection) { + for (Iterator<?> it = ((IStructuredSelection) mSelection).iterator(); it.hasNext();) { + Object element = it.next(); + IProject project = null; + if (element instanceof IProject) { + project = (IProject) element; + } else if (element instanceof IAdaptable) { + project = (IProject) ((IAdaptable) element).getAdapter(IProject.class); + } + if (project != null) { + // It is advisable that the user saves before proceeding, + // revealing any compilation errors. The following lines + // enforce a save as a convenience. + RefactoringSaveHelper save_helper = new RefactoringSaveHelper( + RefactoringSaveHelper.SAVE_ALL_ALWAYS_ASK); + if (save_helper.saveEditors(AdtPlugin.getShell())) { + promptNewName(project); + } + } + } + } + } + + /* + * Validate the new package name and start the refactoring wizard + */ + private void promptNewName(final IProject project) { + + ManifestData manifestData = AndroidManifestHelper.parseForData(project); + if (manifestData == null) { + return; + } + + final String oldPackageNameString = manifestData.getPackage(); + + final AST astValidator = AST.newAST(AST.JLS3); + Name oldPackageName = astValidator.newName(oldPackageNameString); + + IInputValidator validator = new IInputValidator() { + + @Override + public String isValid(String newText) { + try { + astValidator.newName(newText); + } catch (IllegalArgumentException e) { + return "Illegal package name."; + } + + if (newText.equals(oldPackageNameString)) + return "No change."; + else + return null; + } + }; + + InputDialog dialog = new InputDialog(AdtPlugin.getShell(), + "Rename Application Package", "Enter new package name:", oldPackageNameString, + validator); + + if (dialog.open() == Window.OK) { + Name newPackageName = astValidator.newName(dialog.getValue()); + initiateAndroidPackageRefactoring(project, oldPackageName, newPackageName); + } + } + + + private void initiateAndroidPackageRefactoring( + final IProject project, + Name oldPackageName, + Name newPackageName) { + + Refactoring package_name_refactoring = + new ApplicationPackageNameRefactoring(project, oldPackageName, newPackageName); + + ApplicationPackageNameRefactoringWizard wizard = + new ApplicationPackageNameRefactoringWizard(package_name_refactoring); + RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard); + try { + op.run(AdtPlugin.getShell(), package_name_refactoring.getName()); + } catch (InterruptedException e) { + Status s = new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, e.getMessage(), e); + AdtPlugin.getDefault().getLog().log(s); + } + } +} |