blob: 773b0458ff384375a17548177bd674e76a4be39a [file] [log] [blame]
/*
* Copyright 2000-2010 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 org.jetbrains.android.actions;
import com.android.resources.ResourceFolderType;
import com.android.tools.idea.navigator.AndroidProjectViewPane;
import com.intellij.CommonBundle;
import com.intellij.ide.IdeView;
import com.intellij.ide.projectView.ProjectView;
import com.intellij.ide.projectView.impl.AbstractProjectViewPane;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.InputValidator;
import com.intellij.openapi.ui.InputValidatorEx;
import com.intellij.openapi.ui.Messages;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.TextFieldWithAutoCompletion;
import com.intellij.ui.components.JBLabel;
import org.jetbrains.android.dom.layout.AndroidLayoutUtil;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.util.AndroidBundle;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.*;
import java.util.List;
/**
* @author Eugene.Kudelevsky
*
* Like CreateTypedResourceFileAction but prompts for a root tag
*/
public class CreateMultiRootResourceFileAction extends CreateTypedResourceFileAction {
private String myLastRootComponentName;
public CreateMultiRootResourceFileAction(@NotNull String resourcePresentableName,
@NotNull ResourceFolderType resourceFolderType) {
super(resourcePresentableName, resourceFolderType, false, false);
}
@NotNull
@Override
protected PsiElement[] invokeDialog(@NotNull Project project, @NotNull DataContext dataContext) {
final IdeView view = LangDataKeys.IDE_VIEW.getData(dataContext);
if (view != null) {
// If you're in the Android View, we want to ask you not just the filename but also let you
// create other resource folder configurations
AbstractProjectViewPane pane = ProjectView.getInstance(project).getCurrentProjectViewPane();
if (pane instanceof AndroidProjectViewPane) {
return CreateResourceFileAction.getInstance().invokeDialog(project, dataContext);
}
final PsiDirectory directory = view.getOrChooseDirectory();
if (directory != null) {
InputValidator validator = createValidator(project, directory);
final AndroidFacet facet = AndroidFacet.getInstance(directory);
if (facet != null) {
final MyDialog dialog = new MyDialog(facet, validator);
dialog.show();
return PsiElement.EMPTY_ARRAY;
}
}
}
Module module = LangDataKeys.MODULE.getData(dataContext);
if (module != null) {
final AndroidFacet facet = AndroidFacet.getInstance(module);
assert facet != null;
PsiDirectory directory = getResourceDirectory(null, module, true);
if (directory != null) {
PsiDirectory typeDirectory = directory.findSubdirectory(myResourceType.getName());
if (typeDirectory == null) {
return PsiElement.EMPTY_ARRAY;
}
InputValidator validator = createValidator(project, typeDirectory);
final MyDialog dialog = new MyDialog(facet, validator);
dialog.show();
}
}
return PsiElement.EMPTY_ARRAY;
}
@NotNull
@Override
protected PsiElement[] create(String newName, PsiDirectory directory) throws Exception {
final String rootTag = myLastRootComponentName != null ? myLastRootComponentName : getDefaultRootTag();
return doCreateAndNavigate(newName, directory, rootTag, false, true);
}
@NotNull
@Override
public List<String> getAllowedTagNames(@NotNull AndroidFacet facet) {
assert myResourceType == ResourceFolderType.LAYOUT; // if not, must override getAllowedTagNames
return AndroidLayoutUtil.getPossibleRoots(facet);
}
public class MyDialog extends DialogWrapper {
private final InputValidator myValidator;
private JTextField myFileNameField;
private TextFieldWithAutoCompletion<String> myRootElementField;
private JPanel myPanel;
private JPanel myRootElementFieldWrapper;
private JBLabel myRootElementLabel;
protected MyDialog(@NotNull AndroidFacet facet, @Nullable InputValidator validator) {
super(facet.getModule().getProject());
myValidator = validator;
setTitle(AndroidBundle.message("new.typed.resource.dialog.title", myResourcePresentableName));
final List<String> tagNames = getSortedAllowedTagNames(facet);
myRootElementField = new TextFieldWithAutoCompletion<String>(
facet.getModule().getProject(), new TextFieldWithAutoCompletion.StringsCompletionProvider(tagNames, null), true, null);
myRootElementField.setText(myDefaultRootTag);
myRootElementFieldWrapper.add(myRootElementField, BorderLayout.CENTER);
myRootElementLabel.setLabelFor(myRootElementField);
init();
myFileNameField.getDocument().addDocumentListener(new DocumentAdapter() {
@Override
public void textChanged(DocumentEvent event) {
final String text = myFileNameField.getText().trim();
if (myValidator instanceof InputValidatorEx) {
setErrorText(((InputValidatorEx) myValidator).getErrorText(text));
}
}
});
}
@Override
protected JComponent createCenterPanel() {
return myPanel;
}
@Override
public JComponent getPreferredFocusedComponent() {
return myFileNameField;
}
@Override
protected void doOKAction() {
final String fileName = myFileNameField.getText().trim();
myLastRootComponentName = myRootElementField.getText().trim();
if (fileName.length() == 0) {
Messages.showErrorDialog(myPanel, AndroidBundle.message("file.name.not.specified.error"), CommonBundle.getErrorTitle());
return;
}
if (myLastRootComponentName.length() == 0) {
Messages.showErrorDialog(myPanel, AndroidBundle.message("root.element.not.specified.error"), CommonBundle.getErrorTitle());
return;
}
if (myValidator == null ||
myValidator.checkInput(fileName) && myValidator.canClose(fileName)) {
super.doOKAction();
}
}
}
}