aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceWizard.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceWizard.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceWizard.java157
1 files changed, 157 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceWizard.java
new file mode 100644
index 000000000..6ffe25d22
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/refactorings/core/RenameResourceWizard.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2012 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.core;
+
+import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
+import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.resources.ResourceType;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
+import org.eclipse.jdt.internal.ui.JavaPluginImages;
+import org.eclipse.jdt.internal.ui.refactoring.reorg.RenameRefactoringWizard;
+import org.eclipse.jdt.ui.refactoring.RefactoringSaveHelper;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Rename refactoring wizard for Android resources such as {@code @id/foo}
+ */
+@SuppressWarnings("restriction") // JDT refactoring UI
+public class RenameResourceWizard extends RenameRefactoringWizard {
+ private ResourceType mType;
+ private boolean mCanClear;
+
+ /**
+ * Constructs a new {@linkplain RenameResourceWizard}
+ *
+ * @param refactoring the refactoring
+ * @param type the type of resource being renamed
+ * @param canClear whether the user can clear the value
+ */
+ public RenameResourceWizard(
+ @NonNull RenameRefactoring refactoring,
+ @NonNull ResourceType type,
+ boolean canClear) {
+ super(refactoring,
+ "Rename Resource",
+ "Enter the new name for this resource",
+ JavaPluginImages.DESC_WIZBAN_REFACTOR_FIELD,
+ IJavaHelpContextIds.RENAME_FIELD_WIZARD_PAGE);
+ mType = type;
+ mCanClear = canClear;
+ }
+
+ @Override
+ protected void addUserInputPages() {
+ RenameRefactoring refactoring = (RenameRefactoring) getRefactoring();
+ RenameResourceProcessor processor = (RenameResourceProcessor) refactoring.getProcessor();
+ String name = processor.getNewName();
+ addPage(new RenameResourcePage(mType, name, mCanClear));
+ }
+
+ /**
+ * Initiates a renaming of a resource item
+ *
+ * @param shell the shell to parent the dialog to
+ * @param project the project containing the resource references
+ * @param type the type of resource
+ * @param currentName the name of the resource
+ * @param newName the new name, or null if not known
+ * @param canClear whether the name is allowed to be cleared
+ * @return false if initiating the rename failed
+ */
+ public static RenameResult renameResource(
+ @NonNull Shell shell,
+ @NonNull IProject project,
+ @NonNull ResourceType type,
+ @NonNull String currentName,
+ @Nullable String newName,
+ boolean canClear) {
+ try {
+ RenameResourceProcessor processor = new RenameResourceProcessor(project, type,
+ currentName, newName);
+ RenameRefactoring refactoring = new RenameRefactoring(processor);
+ if (!refactoring.isApplicable()) {
+ return RenameResult.unavailable();
+ }
+
+ if (!show(refactoring, processor, shell, type, canClear)) {
+ return RenameResult.canceled();
+ }
+ return RenameResult.name(processor.getNewName());
+ } catch (CoreException e) {
+ AdtPlugin.log(e, null);
+ }
+
+ return RenameResult.unavailable();
+ }
+
+ /**
+ * Show a refactoring dialog for the given resource refactoring operation
+ *
+ * @param refactoring the rename refactoring
+ * @param processor the field processor
+ * @param parent the parent shell
+ * @param type the resource type
+ * @param canClear whether the user is allowed to clear/reset the name to
+ * nothing
+ * @return true if the refactoring was performed, and false if it was
+ * canceled
+ * @throws CoreException if an unexpected error occurs
+ */
+ private static boolean show(
+ @NonNull RenameRefactoring refactoring,
+ @NonNull RenameResourceProcessor processor,
+ @NonNull Shell parent,
+ @NonNull ResourceType type,
+ boolean canClear) throws CoreException {
+ RefactoringSaveHelper saveHelper = new RefactoringSaveHelper(
+ RefactoringSaveHelper.SAVE_REFACTORING);
+ if (!saveHelper.saveEditors(parent)) {
+ return false;
+ }
+
+ try {
+ RenameResourceWizard wizard = new RenameResourceWizard(refactoring, type, canClear);
+ RefactoringWizardOpenOperation operation = new RefactoringWizardOpenOperation(wizard);
+ String dialogTitle = wizard.getDefaultPageTitle();
+ int result = operation.run(parent, dialogTitle == null ? "" : dialogTitle);
+ RefactoringStatus status = operation.getInitialConditionCheckingStatus();
+ if (status.hasFatalError()) {
+ return false;
+ }
+ if (result == RefactoringWizardOpenOperation.INITIAL_CONDITION_CHECKING_FAILED
+ || result == IDialogConstants.CANCEL_ID) {
+ saveHelper.triggerIncrementalBuild();
+ return false;
+ }
+
+ // Save modified resources; need to trigger R file regeneration
+ saveHelper.saveEditors(parent);
+
+ return true;
+ } catch (InterruptedException e) {
+ return false; // Canceled
+ }
+ }
+}