/* * 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; } } }