blob: d5d733d9277fd79707834e474b4bfde7b4ff753f [file] [log] [blame]
/*
* Copyright 2000-2013 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.ide.actions;
import com.intellij.lang.LangBundle;
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.ValidationInfo;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiElement;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.Map;
/**
* @author peter
*/
public class CreateFileFromTemplateDialog extends DialogWrapper {
private JTextField myNameField;
private TemplateKindCombo myKindCombo;
private JPanel myPanel;
private JLabel myUpDownHint;
private JLabel myKindLabel;
private ElementCreator myCreator;
private InputValidator myInputValidator;
protected CreateFileFromTemplateDialog(@NotNull Project project) {
super(project, true);
myKindLabel.setLabelFor(myKindCombo);
myKindCombo.registerUpDownHint(myNameField);
myUpDownHint.setIcon(PlatformIcons.UP_DOWN_ARROWS);
init();
}
@Nullable
@Override
protected ValidationInfo doValidate() {
if (myInputValidator != null) {
final String text = myNameField.getText();
final boolean canClose = myInputValidator.canClose(text);
if (!canClose) {
String errorText = LangBundle.message("incorrect.name");
if (myInputValidator instanceof InputValidatorEx) {
String message = ((InputValidatorEx)myInputValidator).getErrorText(text);
if (message != null) {
errorText = message;
}
}
return new ValidationInfo(errorText, myNameField);
}
}
return super.doValidate();
}
protected JTextField getNameField() {
return myNameField;
}
protected TemplateKindCombo getKindCombo() {
return myKindCombo;
}
private String getEnteredName() {
final JTextField nameField = getNameField();
final String text = nameField.getText().trim();
nameField.setText(text);
return text;
}
@Override
protected JComponent createCenterPanel() {
return myPanel;
}
@Override
protected void doOKAction() {
if (myCreator.tryCreate(getEnteredName()).length == 0) {
return;
}
super.doOKAction();
}
@Override
public JComponent getPreferredFocusedComponent() {
return getNameField();
}
public static Builder createDialog(@NotNull final Project project) {
final CreateFileFromTemplateDialog dialog = new CreateFileFromTemplateDialog(project);
return new BuilderImpl(dialog, project);
}
private static class BuilderImpl implements Builder {
private final CreateFileFromTemplateDialog myDialog;
private final Project myProject;
public BuilderImpl(CreateFileFromTemplateDialog dialog, Project project) {
myDialog = dialog;
myProject = project;
}
@Override
public Builder setTitle(String title) {
myDialog.setTitle(title);
return this;
}
@Override
public Builder addKind(@NotNull String name, @Nullable Icon icon, @NotNull String templateName) {
myDialog.getKindCombo().addItem(name, icon, templateName);
return this;
}
@Override
public Builder setValidator(InputValidator validator) {
myDialog.myInputValidator = validator;
return this;
}
@Override
public <T extends PsiElement> T show(@NotNull String errorTitle, @Nullable String selectedTemplateName,
@NotNull final FileCreator<T> creator) {
final Ref<T> created = Ref.create(null);
myDialog.getKindCombo().setSelectedName(selectedTemplateName);
myDialog.myCreator = new ElementCreator(myProject, errorTitle) {
@Override
protected PsiElement[] create(String newName) throws Exception {
final T element = creator.createFile(myDialog.getEnteredName(), myDialog.getKindCombo().getSelectedName());
created.set(element);
if (element != null) {
return new PsiElement[]{element};
}
return PsiElement.EMPTY_ARRAY;
}
@Override
protected String getActionName(String newName) {
return creator.getActionName(newName, myDialog.getKindCombo().getSelectedName());
}
};
myDialog.show();
if (myDialog.getExitCode() == OK_EXIT_CODE) {
return created.get();
}
return null;
}
@Nullable
@Override
public Map<String,String> getCustomProperties() {
return null;
}
}
public interface Builder {
Builder setTitle(String title);
Builder setValidator(InputValidator validator);
Builder addKind(@NotNull String kind, @Nullable Icon icon, @NotNull String templateName);
@Nullable
<T extends PsiElement> T show(@NotNull String errorTitle, @Nullable String selectedItem, @NotNull FileCreator<T> creator);
@Nullable
Map<String,String> getCustomProperties();
}
public interface FileCreator<T> {
@Nullable
T createFile(@NotNull String name, @NotNull String templateName);
@NotNull
String getActionName(@NotNull String name, @NotNull String templateName);
}
}