blob: 2218b7598884f381ac23def787babee997a5993f [file] [log] [blame]
/*
* 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;
}
}
}