blob: 9fc5bfc73300c31ef1ba5f2bb5c979c1ffc716b7 [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.refactoring.lang;
import com.intellij.ide.util.DirectoryUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.ex.FileTypeChooser;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.ui.VerticalFlowLayout;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.PsiFileSystemItemUtil;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.ui.DocumentAdapter;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.io.File;
/**
* @author ven
*/
public class ExtractIncludeDialog extends DialogWrapper {
protected TextFieldWithBrowseButton myTargetDirectoryField;
private JTextField myNameField;
private final PsiDirectory myCurrentDirectory;
private static final String REFACTORING_NAME = RefactoringBundle.message("extractIncludeFile.name");
protected final String myExtension;
protected JLabel myTargetDirLabel;
public PsiDirectory getTargetDirectory() {
return myTargetDirectory;
}
private PsiDirectory myTargetDirectory;
public String getTargetFileName () {
String name = myNameField.getText().trim();
return name.contains(".") ? name: name + "." + myExtension;
}
public ExtractIncludeDialog(final PsiDirectory currentDirectory, final String extension) {
super(true);
myCurrentDirectory = currentDirectory;
myExtension = extension;
setTitle(REFACTORING_NAME);
init();
}
@Override
public JComponent getPreferredFocusedComponent() {
return myNameField;
}
@Override
protected JComponent createCenterPanel() {
JPanel panel = new JPanel(new VerticalFlowLayout());
JLabel nameLabel = new JLabel();
panel.add(nameLabel);
myNameField = new JTextField();
nameLabel.setLabelFor(myNameField);
myNameField.getDocument().addDocumentListener(new DocumentAdapter() {
@Override
protected void textChanged(DocumentEvent e) {
validateOKButton();
}
});
panel.add(myNameField);
nameLabel.setText(getNameLabel());
myTargetDirLabel = new JLabel();
panel.add(myTargetDirLabel);
myTargetDirectoryField = new TextFieldWithBrowseButton();
myTargetDirectoryField.setText(myCurrentDirectory.getVirtualFile().getPresentableUrl());
myTargetDirectoryField.addBrowseFolderListener(RefactoringBundle.message("select.target.directory"),
RefactoringBundle.message("select.target.directory.description"),
null, FileChooserDescriptorFactory.createSingleFolderDescriptor());
myTargetDirLabel.setText(RefactoringBundle.message("extract.to.directory"));
panel.add(myTargetDirectoryField);
myTargetDirectoryField.getTextField().getDocument().addDocumentListener(new DocumentAdapter() {
@Override
public void textChanged(DocumentEvent event) {
validateOKButton();
}
});
validateOKButton();
return panel;
}
protected String getNameLabel() {
return RefactoringBundle.message("name.for.extracted.include.file", myExtension);
}
private void validateOKButton() {
final String fileName = myNameField.getText().trim();
setOKActionEnabled(myTargetDirectoryField.getText().trim().length() > 0 &&
fileName.length() > 0 && fileName.indexOf(File.separatorChar) < 0 &&
!StringUtil.containsAnyChar(fileName, "*?><\":;|") && fileName.indexOf(".") != 0);
}
private static boolean isFileExist(@NotNull final String directory, @NotNull final String fileName) {
return LocalFileSystem.getInstance().findFileByIoFile(new File(directory, fileName)) != null;
}
@Override
protected void doOKAction() {
final Project project = myCurrentDirectory.getProject();
final String directoryName = myTargetDirectoryField.getText().replace(File.separatorChar, '/');
final String targetFileName = getTargetFileName();
if (isFileExist(directoryName, targetFileName)) {
Messages.showErrorDialog(project, RefactoringBundle.message("file.already.exist", targetFileName), RefactoringBundle.message("file.already.exist.title"));
return;
}
final FileType type = FileTypeChooser.getKnownFileTypeOrAssociate(targetFileName);
if (type == null) {
return;
}
CommandProcessor.getInstance().executeCommand(project, new Runnable() {
@Override
public void run() {
final Runnable action = new Runnable() {
@Override
public void run() {
try {
PsiDirectory targetDirectory = DirectoryUtil.mkdirs(PsiManager.getInstance(project), directoryName);
targetDirectory.checkCreateFile(targetFileName);
final String webPath = PsiFileSystemItemUtil.getRelativePath(myCurrentDirectory, targetDirectory);
myTargetDirectory = webPath == null ? null : targetDirectory;
}
catch (IncorrectOperationException e) {
CommonRefactoringUtil.showErrorMessage(REFACTORING_NAME, e.getMessage(), null, project);
}
}
};
ApplicationManager.getApplication().runWriteAction(action);
}
}, RefactoringBundle.message("create.directory"), null);
if (myTargetDirectory == null) return;
super.doOKAction();
}
@Override
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp(getHelpTopic());
}
protected String getHelpTopic() {
return ExtractIncludeFileBase.HELP_ID;
}
@Override
@NotNull
protected Action[] createActions() {
return new Action[]{getOKAction(), getCancelAction(), getHelpAction()};
}
protected void hideTargetDirectory() {
myTargetDirectoryField.setVisible(false);
myTargetDirLabel.setVisible(false);
}
}