diff options
Diffstat (limited to 'plugins/properties/src/com/intellij/lang/properties/refactoring/rename/ResourceBundleRenameUtil.java')
-rw-r--r-- | plugins/properties/src/com/intellij/lang/properties/refactoring/rename/ResourceBundleRenameUtil.java | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/plugins/properties/src/com/intellij/lang/properties/refactoring/rename/ResourceBundleRenameUtil.java b/plugins/properties/src/com/intellij/lang/properties/refactoring/rename/ResourceBundleRenameUtil.java new file mode 100644 index 000000000000..79694f7ae35a --- /dev/null +++ b/plugins/properties/src/com/intellij/lang/properties/refactoring/rename/ResourceBundleRenameUtil.java @@ -0,0 +1,152 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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.intellij.lang.properties.refactoring.rename; + +import com.intellij.codeInsight.FileModificationService; +import com.intellij.lang.properties.PropertiesBundle; +import com.intellij.lang.properties.ResourceBundle; +import com.intellij.lang.properties.psi.PropertiesFile; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.InputValidator; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiNamedElement; +import com.intellij.refactoring.rename.PsiElementRenameHandler; +import com.intellij.refactoring.rename.RenameProcessor; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.List; + +/** + * @author Dmitry Batkovich + */ +public class ResourceBundleRenameUtil { + private final static Logger LOG = Logger.getInstance(ResourceBundleRenameUtil.class); + + public static void renameResourceBundleKey(final @NotNull PsiElement psiElement, final @NotNull Project project) { + PsiElementRenameHandler.invoke(psiElement, project, psiElement.getContainingFile(), null); + } + + public static void renameResourceBundleBaseName(final @NotNull ResourceBundle resourceBundle, final @NotNull Project project) { + Messages.showInputDialog(project, PropertiesBundle.message("rename.bundle.enter.new.resource.bundle.base.name.prompt.text"), + PropertiesBundle.message("rename.resource.bundle.dialog.title"), Messages.getQuestionIcon(), + resourceBundle.getBaseName(), new ResourceBundleBaseNameInputValidator(project, resourceBundle)); + } + + public static void renameResourceBundleKeySection(final List<PsiElement> psiElements, final String section, final int sectionPosition) { + if (psiElements.isEmpty()) { + return; + } + final Project project = psiElements.get(0).getProject(); + Messages.showInputDialog(project, PropertiesBundle.message("rename.bundle.enter.new.resource.bundle.section.name.prompt.text"), + PropertiesBundle.message("rename.resource.bundle.section.dialog.title"), Messages.getQuestionIcon(), section, + new ResourceBundleKeySectionInputValidator(psiElements, section, sectionPosition, project)); + } + + private static class ResourceBundleKeySectionInputValidator implements InputValidator { + + private final List<PsiElement> myPsiElements; + private final String mySection; + private final int mySectionPosition; + private final Project myProject; + + private ResourceBundleKeySectionInputValidator(final List<PsiElement> psiElements, + final String section, + final int sectionPosition, + final Project project) { + myPsiElements = psiElements; + mySection = section; + mySectionPosition = sectionPosition; + myProject = project; + } + + @Override + public boolean checkInput(final String inputString) { + return inputString.indexOf('.') < 0; + } + + @Override + public boolean canClose(final String inputString) { + RenameProcessor renameProcessor = null; + for (final PsiElement psiElement : myPsiElements) { + assert psiElement instanceof PsiNamedElement; + final String oldName = ((PsiNamedElement)psiElement).getName(); + assert oldName != null; + final String newName = + oldName.substring(0, mySectionPosition) + inputString + oldName.substring(mySectionPosition + mySection.length()); + if (renameProcessor == null) { + renameProcessor = new RenameProcessor(myProject, psiElement, newName, false, false); + } + else { + renameProcessor.addElement(psiElement, newName); + } + } + assert renameProcessor != null; + renameProcessor.setCommandName(PropertiesBundle.message("rename.resource.bundle.section.dialog.title")); + renameProcessor.doRun(); + return true; + } + } + + private static class ResourceBundleBaseNameInputValidator implements InputValidator { + private final Project myProject; + private final ResourceBundle myResourceBundle; + + public ResourceBundleBaseNameInputValidator(final Project project, final ResourceBundle resourceBundle) { + myProject = project; + myResourceBundle = resourceBundle; + } + + public boolean checkInput(String inputString) { + return inputString.indexOf(File.separatorChar) < 0 && inputString.indexOf('/') < 0; + } + + public boolean canClose(final String inputString) { + final List<PropertiesFile> propertiesFiles = myResourceBundle.getPropertiesFiles(); + for (PropertiesFile propertiesFile : propertiesFiles) { + if (!FileModificationService.getInstance().prepareFileForWrite(propertiesFile.getContainingFile())) return false; + } + + RenameProcessor renameProcessor = null; + final String baseName = myResourceBundle.getBaseName(); + for (PropertiesFile propertiesFile : propertiesFiles) { + final VirtualFile virtualFile = propertiesFile.getVirtualFile(); + if (virtualFile == null) { + continue; + } + final String newName = + inputString + virtualFile.getNameWithoutExtension().substring(baseName.length()) + "." + virtualFile.getExtension(); + if (renameProcessor == null) { + renameProcessor = new RenameProcessor(myProject, propertiesFile.getContainingFile(), newName, false, false); + continue; + } + renameProcessor.addElement(propertiesFile.getContainingFile(), newName); + } + if (renameProcessor == null) { + LOG.assertTrue(false); + return true; + } + + renameProcessor.setCommandName(PropertiesBundle.message("rename.resource.bundle.dialog.title")); + renameProcessor.doRun(); + + return true; + } + } +} |