blob: 78715ddf72b8f7c11466accbb7a4bcd5a8d4b74d [file] [log] [blame]
/*
* Copyright 2000-2009 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.uiDesigner.actions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.uiDesigner.GuiDesignerConfiguration;
import com.intellij.uiDesigner.UIDesignerBundle;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
/**
* @author Anton Katilin
* @author Vladimir Kondratyev
*/
public final class CreateDialogAction extends AbstractCreateFormAction {
private boolean myRecentGenerateOK;
private boolean myRecentGenerateCancel;
private boolean myRecentGenerateMain;
public CreateDialogAction() {
super(UIDesignerBundle.message("action.create.dialog"),
UIDesignerBundle.message("action.description.create.dialog"), PlatformIcons.UI_FORM_ICON);
}
@NotNull
protected PsiElement[] invokeDialog(final Project project, final PsiDirectory directory) {
final MyInputValidator validator = new JavaNameValidator(project, directory);
final MyContentPane contentPane = new MyContentPane();
final DialogWrapper dialog = new DialogWrapper(project, true) {
{
init();
setTitle(UIDesignerBundle.message("title.new.dialog"));
}
protected JComponent createCenterPanel() {
return contentPane.getPanel();
}
protected void doOKAction() {
myRecentGenerateOK = contentPane.myChkGenerateOK.isSelected();
myRecentGenerateCancel = contentPane.myChkGenerateCancel.isSelected();
myRecentGenerateMain = contentPane.myChkGenerateMain.isSelected();
final String inputString = contentPane.myTfClassName.getText().trim();
if (
validator.checkInput(inputString) &&
validator.canClose(inputString)
) {
close(OK_EXIT_CODE);
}
}
public JComponent getPreferredFocusedComponent() {
return contentPane.myTfClassName;
}
};
dialog.show();
return validator.getCreatedElements();
}
protected String getCommandName() {
return UIDesignerBundle.message("command.create.dialog");
}
protected String getErrorTitle() {
return UIDesignerBundle.message("error.cannot.create.dialog");
}
private static String createClassBody(
final String className,
final boolean generateOK,
final boolean generateCancel,
final boolean generateMain
) {
@NonNls final StringBuffer result = new StringBuffer(1024);
result.append("public class ").append(className).append(" extends javax.swing.JDialog {\n");
result.append("private javax.swing.JPanel contentPane;\n");
result.append("private javax.swing.JButton buttonOK;\n");
result.append("private javax.swing.JButton buttonCancel;\n");
result.append("\n");
result.append("public ").append(className).append("(){\n");
result.append("setContentPane(contentPane);\n");
result.append("setModal(true);\n");
result.append("getRootPane().setDefaultButton(buttonOK);\n");
if (generateOK) {
result.append("\n");
result.append("buttonOK.addActionListener(");
result.append("new java.awt.event.ActionListener(){");
result.append("public void actionPerformed(java.awt.event.ActionEvent e){");
result.append("onOK();");
result.append("}});\n");
}
if (generateCancel) {
result.append("\n");
result.append("buttonCancel.addActionListener(");
result.append("new java.awt.event.ActionListener(){");
result.append("public void actionPerformed(java.awt.event.ActionEvent e){");
result.append("onCancel();");
result.append("}});\n");
result.append("\n");
result.append(UIDesignerBundle.message("comment.call.onCancel.cross")).append("\n");
result.append("setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);\n");
result.append("addWindowListener(new java.awt.event.WindowAdapter() {\n");
result.append(" public void windowClosing(java.awt.event.WindowEvent e) {\n");
result.append(" onCancel();\n");
result.append(" }\n");
result.append("});\n");
result.append("\n");
result.append(UIDesignerBundle.message("comment.call.onCancel.escape")).append("\n");
result.append("contentPane.registerKeyboardAction(");
result.append(" new java.awt.event.ActionListener() {");
result.append(" public void actionPerformed(java.awt.event.ActionEvent e) {");
result.append(" onCancel();\n");
result.append(" }");
result.append(" },");
result.append(" javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ESCAPE, 0),");
result.append(" javax.swing.JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT");
result.append(");");
}
result.append("}\n");
if (generateOK) {
result.append("\n");
result.append("private void onOK(){\n");
result.append(UIDesignerBundle.message("comment.onok")).append("\n");
result.append("dispose();\n");
result.append("}\n");
}
if (generateCancel) {
result.append("\n");
result.append("private void onCancel(){\n");
result.append(UIDesignerBundle.message("comment.oncancel")).append("\n");
result.append("dispose();\n");
result.append("}\n");
}
if (generateMain) {
result.append("\n");
result.append("public static void main(String[] args){\n");
result.append(className).append(" dialog = new ").append(className).append("();\n");
result.append("dialog.pack();\n");
result.append("dialog.setVisible(true);\n");
result.append("System.exit(0);\n");
result.append("}\n");
}
result.append("}\n");
return result.toString();
}
@NotNull
protected PsiElement[] create(final String newName, final PsiDirectory directory) throws IncorrectOperationException {
PsiFile sourceFile = PsiFileFactory.getInstance(directory.getProject())
.createFileFromText(newName + ".java", createClassBody(newName, myRecentGenerateOK, myRecentGenerateCancel, myRecentGenerateMain));
sourceFile = (PsiFile)directory.add(sourceFile);
JavaCodeStyleManager.getInstance(directory.getProject()).shortenClassReferences(sourceFile);
CodeStyleManager.getInstance(directory.getProject()).reformat(sourceFile);
final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory);
final String packageName = aPackage.getQualifiedName();
final String fqClassName = packageName.length() == 0 ? newName : packageName + "." + newName;
final String formBody = createFormBody(fqClassName, "/com/intellij/uiDesigner/NewDialog.xml",
GuiDesignerConfiguration.getInstance(directory.getProject()).DEFAULT_LAYOUT_MANAGER);
final PsiFile formFile = PsiFileFactory.getInstance(directory.getProject()).createFileFromText(newName + ".form", formBody);
PsiElement createdFile = directory.add(formFile);
PsiClass[] classes = ((PsiJavaFile)sourceFile).getClasses();
return new PsiElement[]{createdFile, classes[0]};
}
private static final class MyContentPane {
private JPanel myPanel;
private JCheckBox myChkGenerateCancel;
private JCheckBox myChkGenerateOK;
private JCheckBox myChkGenerateMain;
private JTextField myTfClassName;
public MyContentPane() {
}
public JPanel getPanel() {
return myPanel;
}
}
}