package org.jetbrains.plugins.cucumber.inspections.ui; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.InputValidator; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.cucumber.CucumberBundle; import org.jetbrains.plugins.cucumber.inspections.model.CreateStepDefinitionFileModel; import org.jetbrains.plugins.cucumber.inspections.model.FileTypeComboboxItem; import org.jetbrains.plugins.cucumber.steps.CucumberStepsIndex; import javax.swing.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class CreateStepDefinitionFileDialog extends DialogWrapper { private JTextField myFileNameTextField; private JComboBox myFileTypeCombobox; private JPanel myContentPanel; private TextFieldWithBrowseButton myDirectoryTextField; private InputValidator myValidator; private CreateStepDefinitionFileModel myModel; public CreateStepDefinitionFileDialog(@NotNull final Project project, @NotNull final CreateStepDefinitionFileModel model, @NotNull final InputValidator validator) { super(project); myModel = model; myValidator = validator; setTitle(CucumberBundle.message("cucumber.quick.fix.create.step.choose.new.file.dialog.title")); init(); myFileTypeCombobox.setModel(model.getFileTypeModel()); myFileTypeCombobox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { FileTypeComboboxItem newItem = (FileTypeComboboxItem)myFileTypeCombobox.getSelectedItem(); FileTypeComboboxItem oldItem = (FileTypeComboboxItem)e.getItem(); if (oldItem.getDefaultFileName().equals(myFileNameTextField.getText())) { myFileNameTextField.setText(newItem.getDefaultFileName()); myModel.setFileName(newItem.getDefaultFileName()); } myDirectoryTextField.setText(FileUtil.toSystemDependentName(model.getDefaultDirectory().getVirtualFile().getPath())); } }); myFileNameTextField.setText(model.getFileName()); final FileNameKeyListener keyListener = new FileNameKeyListener(); myFileNameTextField.addKeyListener(keyListener); String folderChooserTitle = CucumberBundle.message("cucumber.quick.fix.create.step.folder.chooser.title"); final FileChooserDescriptor folderChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor(); folderChooserDescriptor.setTitle(folderChooserTitle); folderChooserDescriptor.setRoots(model.getDirectory().getVirtualFile()); folderChooserDescriptor.withTreeRootVisible(true); folderChooserDescriptor.setShowFileSystemRoots(false); folderChooserDescriptor.setHideIgnored(true); myDirectoryTextField.addBrowseFolderListener(folderChooserTitle, null, project, folderChooserDescriptor); myDirectoryTextField.getTextField().addKeyListener(keyListener); myDirectoryTextField.setText(FileUtil.toSystemDependentName(model.getDefaultDirectory().getVirtualFile().getPath())); validateAll(); } public JComponent getPreferredFocusedComponent() { return myFileNameTextField; } @Override protected void doOKAction() { String fileName = myFileNameTextField.getText(); if (myValidator == null) { close(OK_EXIT_CODE); } else { if (myValidator.checkInput(fileName) && myValidator.canClose(fileName)) { myModel.setFileName(myFileNameTextField.getText()); close(OK_EXIT_CODE); } } } @Override protected JComponent createCenterPanel() { return myContentPanel; } @Nullable @Override protected String getDimensionServiceKey() { return CreateStepDefinitionFileDialog.class.getName(); } protected boolean validateAll() { if (validateFileName()) { return validateDirectoryPath(); } else { return false; } } protected boolean validateFileName() { final String fileName = myFileNameTextField.getText(); Project project = myModel.getDirectory().getProject(); boolean fileNameIsOk = fileName != null && CucumberStepsIndex.getInstance(project) .validateNewStepDefinitionFileName(myModel.getDirectory(), fileName, myModel.getSelectedFileType()); if (!fileNameIsOk) { setErrorText(CucumberBundle.message("cucumber.quick.fix.create.step.file.error.incorrect.file.name"), myFileNameTextField); } else { PsiFile file = myModel.getDirectory().findFile(myModel.getFileNameWithExtension()); VirtualFile vFile = file != null ? file.getVirtualFile() : null; if (vFile != null) { fileNameIsOk = false; setErrorText(CucumberBundle.message("cucumber.quick.fix.create.step.file.error.file.exists", (myModel.getFileNameWithExtension())), myFileNameTextField); } } return fileNameIsOk; } protected boolean validateDirectoryPath() { final VirtualFile vFile = LocalFileSystem.getInstance().findFileByPath(myDirectoryTextField.getText()); final boolean directoryIsOk = vFile != null && vFile.exists(); if (!directoryIsOk) { setErrorText(CucumberBundle.message("cucumber.quick.fix.create.step.file.error.directory.doesnt.exist"), myDirectoryTextField); } else { setErrorText(null); } setOKActionEnabled(directoryIsOk); return directoryIsOk; } class FileNameKeyListener implements KeyListener { @Override public void keyTyped(KeyEvent e) {} @Override public void keyPressed(KeyEvent e) {} @Override public void keyReleased(KeyEvent e) { myModel.setFileName(myFileNameTextField.getText()); final VirtualFile vFile = LocalFileSystem.getInstance().findFileByPath(myDirectoryTextField.getText()); if (vFile != null) { final PsiDirectory psiDirectory = PsiManager.getInstance(myModel.getProject()).findDirectory(vFile); if (psiDirectory != null) { myModel.setDirectory(psiDirectory); } } validateAll(); } } }