| /* |
| * 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.editor; |
| |
| import com.intellij.icons.AllIcons; |
| import com.intellij.lang.properties.PropertiesBundle; |
| import com.intellij.lang.properties.ResourceBundle; |
| import com.intellij.lang.properties.psi.PropertiesFile; |
| import com.intellij.lang.properties.structureView.PropertiesPrefixGroup; |
| import com.intellij.openapi.actionSystem.ActionPlaces; |
| import com.intellij.openapi.actionSystem.AnAction; |
| import com.intellij.openapi.actionSystem.AnActionEvent; |
| import com.intellij.openapi.actionSystem.PlatformDataKeys; |
| import com.intellij.openapi.application.ApplicationManager; |
| import com.intellij.openapi.command.CommandProcessor; |
| import com.intellij.openapi.fileEditor.FileEditor; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.ui.InputValidator; |
| import com.intellij.openapi.ui.Messages; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| /** |
| * @author Dmitry Batkovich |
| */ |
| class NewPropertyAction extends AnAction { |
| public NewPropertyAction() { |
| super("New Property", null, AllIcons.General.Add); |
| } |
| |
| @Override |
| public void actionPerformed(final AnActionEvent e) { |
| final Project project = getEventProject(e); |
| if (project == null) { |
| return; |
| } |
| final FileEditor editor = PlatformDataKeys.FILE_EDITOR.getData(e.getDataContext()); |
| if (editor == null || !(editor instanceof ResourceBundleEditor)) { |
| return; |
| } |
| final ResourceBundleEditor resourceBundleEditor = (ResourceBundleEditor)editor; |
| |
| final String prefix; |
| final String separator; |
| final String place = e.getPlace(); |
| if (ActionPlaces.STRUCTURE_VIEW_TOOLBAR.equals(place)) { |
| prefix = null; |
| separator = null; |
| } else { |
| final ResourceBundleEditorViewElement selectedElement = resourceBundleEditor.getSelectedElementIfOnlyOne(); |
| if (selectedElement == null) { |
| return; |
| } |
| if (selectedElement instanceof PropertiesPrefixGroup) { |
| final PropertiesPrefixGroup group = (PropertiesPrefixGroup)selectedElement; |
| prefix = group.getPrefix(); |
| separator = group.getSeparator(); |
| } |
| else if (selectedElement instanceof ResourceBundlePropertyStructureViewElement || |
| selectedElement instanceof ResourceBundleFileStructureViewElement) { |
| prefix = null; |
| separator = null; |
| } |
| else { |
| throw new IllegalStateException("unsupported type: " + selectedElement.getClass()); |
| } |
| } |
| final ResourceBundle resourceBundle = resourceBundleEditor.getResourceBundle(); |
| |
| Messages.showInputDialog(project, |
| PropertiesBundle.message("new.property.dialog.name.prompt.text"), |
| PropertiesBundle.message("new.property.dialog.title"), |
| Messages.getQuestionIcon(), |
| null, |
| new NewPropertyNameValidator(resourceBundle, prefix, separator)); |
| } |
| |
| private static class NewPropertyNameValidator implements InputValidator { |
| private final @NotNull ResourceBundle myResourceBundle; |
| private final @Nullable String myPrefix; |
| private final @Nullable String mySeparator; |
| |
| |
| public NewPropertyNameValidator(final @NotNull ResourceBundle resourceBundle, |
| final @Nullable String prefix, |
| final @Nullable String separator) { |
| myResourceBundle = resourceBundle; |
| myPrefix = prefix; |
| mySeparator = separator; |
| } |
| |
| @Override |
| public boolean checkInput(final String inputString) { |
| return true; |
| } |
| |
| @Override |
| public boolean canClose(final String inputString) { |
| final String newPropertyName = myPrefix == null ? inputString : (myPrefix + mySeparator + inputString); |
| |
| for (final PropertiesFile propertiesFile : myResourceBundle.getPropertiesFiles()) { |
| for (final String propertyName : propertiesFile.getNamesMap().keySet()) { |
| if (newPropertyName.equals(propertyName)) { |
| Messages.showErrorDialog("Can't add new property. Property with key \'" + newPropertyName + "\' already exists.", "New Property"); |
| return false; |
| } |
| } |
| } |
| |
| final PropertiesFile defaultPropertiesFile = myResourceBundle.getDefaultPropertiesFile(); |
| ApplicationManager.getApplication().runWriteAction(new Runnable() { |
| @Override |
| public void run() { |
| CommandProcessor.getInstance().runUndoTransparentAction(new Runnable() { |
| @Override |
| public void run() { |
| defaultPropertiesFile.addProperty(newPropertyName, ""); |
| } |
| }); |
| } |
| }); |
| return true; |
| } |
| } |
| } |