package com.intellij.lang.javascript.flex.flashbuilder; import com.intellij.CommonBundle; import com.intellij.ide.util.projectWizard.WizardContext; import com.intellij.lang.javascript.flex.FlexBundle; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.projectImport.ProjectFormatPanel; import com.intellij.projectImport.ProjectImportWizardStep; import com.intellij.ui.DocumentAdapter; import com.intellij.util.PathUtil; import javax.swing.*; import javax.swing.event.DocumentEvent; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SelectDirWithFlashBuilderProjectsStep extends ProjectImportWizardStep { private JPanel myMainPanel; private LabeledComponent<TextFieldWithBrowseButton> myInitialPathComponent; private LabeledComponent<TextFieldWithBrowseButton> myExtractPathComponent; private LabeledComponent<JTextField> myProjectNameComponent; private LabeledComponent<TextFieldWithBrowseButton> myProjectLocationComponent; private JLabel myMultiProjectNote; private JCheckBox myCreateSubfolderCheckBox; private ProjectFormatPanel myProjectFormatPanel; public SelectDirWithFlashBuilderProjectsStep(final WizardContext context) { super(context); setupInitialPathComponent(); myExtractPathComponent.setVisible(false); myExtractPathComponent.getComponent() .addBrowseFolderListener(null, null, context.getProject(), FileChooserDescriptorFactory.createSingleFolderDescriptor()); final boolean creatingNewProject = context.isCreatingNewProject(); myProjectNameComponent.setVisible(creatingNewProject); myProjectLocationComponent.setVisible(creatingNewProject); myProjectLocationComponent.getComponent() .addBrowseFolderListener(null, null, context.getProject(), FileChooserDescriptorFactory.createSingleFolderDescriptor()); myProjectFormatPanel.getPanel().setVisible(creatingNewProject); myMultiProjectNote.setVisible(false); myCreateSubfolderCheckBox.setVisible(false); } private void setupInitialPathComponent() { myInitialPathComponent.getComponent().getTextField().getDocument().addDocumentListener(new DocumentAdapter() { protected void textChanged(final DocumentEvent e) { onInitialPathChanged(); } }); final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, true, true, false, false) { public boolean isFileVisible(final VirtualFile file, final boolean showHiddenFiles) { return (super.isFileVisible(file, showHiddenFiles) && (file.isDirectory() || FlashBuilderProjectFinder.isFlashBuilderProject(file)) || FlashBuilderProjectFinder.hasArchiveExtension(file.getPath())); } public Icon getIcon(final VirtualFile file) { // do not use Flash Builder specific icon for zip return !file.isDirectory() && (FlashBuilderProjectFinder.hasFxpExtension(file.getPath()) || FlashBuilderProjectFinder.isFlashBuilderProject(file)) ? dressIcon(file, getBuilder().getIcon()) : super.getIcon(file); } }; myInitialPathComponent.getComponent().addBrowseFolderListener(FlexBundle.message("select.flash.builder.workspace.or.project"), null, getWizardContext().getProject(), descriptor); } private void onInitialPathChanged() { final String path = myInitialPathComponent.getComponent().getText().trim(); ((FlashBuilderImporter)getBuilder()).setInitiallySelectedPath(path); getWizardContext().requestWizardButtonsUpdate(); final VirtualFile file = path.isEmpty() ? null : LocalFileSystem.getInstance().findFileByPath(path); final boolean isArchive = file != null && !file.isDirectory() && FlashBuilderProjectFinder.hasArchiveExtension(file.getPath()); final boolean multiProjectArchive = isArchive && FlashBuilderProjectFinder.isMultiProjectArchive(file.getPath()); if (getWizardContext().isCreatingNewProject()) { if (file != null) { final String suggestedProjectName = ((FlashBuilderImporter)getBuilder()).getSuggestedProjectName(); myProjectNameComponent.getComponent().setText(suggestedProjectName); if (isArchive) { myProjectLocationComponent.setText(FlexBundle.message("project.location")); String dir = getWizardContext().getProjectFileDirectory(); if (new File(dir).isFile()) { dir = PathUtil.getParentPath(dir); } myProjectLocationComponent.getComponent().setText(FileUtil.toSystemDependentName(dir + "/" + suggestedProjectName)); } else { myProjectLocationComponent.setText(FlexBundle.message("project.files.location")); myProjectLocationComponent.getComponent() .setText(FileUtil.toSystemDependentName(file.isDirectory() ? file.getPath() : file.getParent().getPath())); } } myMultiProjectNote.setVisible(isArchive && multiProjectArchive); myCreateSubfolderCheckBox.setVisible(isArchive && !multiProjectArchive); myCreateSubfolderCheckBox .setText(FlexBundle.message("extract.single.to.subfolder.0", file == null ? "" : file.getNameWithoutExtension())); } else { myExtractPathComponent.setVisible(isArchive); if (isArchive) { myExtractPathComponent.setText(multiProjectArchive ? FlexBundle.message("folder.to.unzip.several.FB.projects") : FlexBundle.message("folder.to.unzip.one.FB.project")); final String extractPath = multiProjectArchive ? getWizardContext().getProject().getBaseDir().getPath() : getWizardContext().getProject().getBaseDir().getPath() + "/" + file.getNameWithoutExtension(); myExtractPathComponent.getComponent().setText(FileUtil.toSystemDependentName(extractPath)); } } } private void createUIComponents() { myProjectFormatPanel = new ProjectFormatPanel(); } public JComponent getComponent() { return myMainPanel; } public JComponent getPreferredFocusedComponent() { return myInitialPathComponent.getComponent().getTextField(); } public void updateStep() { if (getWizardContext().isProjectFileDirectorySet() && myInitialPathComponent.getComponent().getText().isEmpty()) { myInitialPathComponent.getComponent().setText(FileUtil.toSystemDependentName(getWizardContext().getProjectFileDirectory())); } } public void updateDataModel() { final FlashBuilderImporter builder = (FlashBuilderImporter)getBuilder(); builder.setExtractToSubfolder(myCreateSubfolderCheckBox.isSelected()); builder.setExtractPath(FileUtil.toSystemIndependentName(myExtractPathComponent.getComponent().getText().trim())); getWizardContext().setProjectName(myProjectNameComponent.getComponent().getText().trim()); getWizardContext() .setProjectFileDirectory(FileUtil.toSystemIndependentName(myProjectLocationComponent.getComponent().getText().trim())); myProjectFormatPanel.updateData(getWizardContext()); } public boolean validate() throws ConfigurationException { final String path = myInitialPathComponent.getComponent().getText().trim(); if (path.length() == 0) { throw new ConfigurationException(FlexBundle.message("specify.flash.builder.workspace.or.project.dir"), CommonBundle.getErrorTitle()); } final VirtualFile file = LocalFileSystem.getInstance().refreshAndFindFileByPath(path); if (file == null) { throw new ConfigurationException(FlexBundle.message("file.or.folder.not.found", path), CommonBundle.getErrorTitle()); } if (file.isDirectory()) { final List<String> projectPaths = new ArrayList<>(); // false if user cancelled final boolean ok = FlashBuilderProjectFinder.collectAllProjectPaths(getWizardContext().getProject(), projectPaths, path); if (ok) { if (projectPaths.isEmpty()) { throw new ConfigurationException(FlexBundle.message("flash.builder.projects.not.found.in"), CommonBundle.getErrorTitle()); } ((FlashBuilderImporter)getBuilder()).setList(projectPaths); } return ok && checkProjectNameAndPath(); } else { if (FlashBuilderProjectFinder.hasArchiveExtension(file.getPath())) { FlashBuilderProjectFinder.checkArchiveContainsFBProject(file.getPath()); final File dir = new File(getWizardContext().isCreatingNewProject() ? myProjectLocationComponent.getComponent().getText().trim() : myExtractPathComponent.getComponent().getText().trim()); if (dir.isDirectory() && dir.list().length > 0) { final String title = StringUtil.capitalizeWords( ProjectBundle.message("project.new.wizard.import.title", getWizardContext().getPresentationName()), true); if (Messages.YES != Messages .showYesNoDialog(myMainPanel, FlexBundle.message("folder.not.empty", dir.getPath()), title, Messages.getWarningIcon())) { return false; } } } else if (!FlashBuilderProjectFinder.isFlashBuilderProject(file)) { throw new ConfigurationException(FlexBundle.message("not.flash.builder.project"), CommonBundle.getErrorTitle()); } ((FlashBuilderImporter)getBuilder()).setList(Collections.singletonList(path)); return checkProjectNameAndPath(); } } private boolean checkProjectNameAndPath() throws ConfigurationException { if (!getWizardContext().isCreatingNewProject()) return true; if (myProjectNameComponent.getComponent().getText().trim().isEmpty()) { throw new ConfigurationException(FlexBundle.message("project.name.empty")); } if (myProjectLocationComponent.getComponent().getText().trim().isEmpty()) { throw new ConfigurationException(FlexBundle.message("project.path.empty")); } return true; } public String getHelpId() { return "reference.dialogs.new.project.import.flex.page1"; } }