blob: 757782851e8035aaaa7435dc763461d23ef36cf8 [file] [log] [blame]
/*
* Copyright 2000-2012 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.platform;
import com.intellij.facet.ui.FacetEditorValidator;
import com.intellij.facet.ui.FacetValidatorsManager;
import com.intellij.facet.ui.ValidationResult;
import com.intellij.ide.impl.ProjectUtil;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.ListCellRendererWrapper;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
/**
* @author yole
*/
public class NewDirectoryProjectDialog extends DialogWrapper {
private JTextField myProjectNameTextField;
private TextFieldWithBrowseButton myLocationField;
protected JPanel myRootPane;
protected JComboBox myProjectTypeComboBox;
private JPanel myProjectTypePanel;
private JLabel myLocationLabel;
protected JPanel getPlaceHolder() {
return myPlaceHolder;
}
private JPanel myPlaceHolder;
private static final Object EMPTY_PROJECT_GENERATOR = new Object();
private final DirectoryProjectGenerator myGeneratorBeforeSeparator;
protected NewDirectoryProjectDialog(Project project) {
super(project, true);
setTitle("Create New Project");
init();
myLocationLabel.setLabelFor(myLocationField.getChildComponent());
new LocationNameFieldsBinding(project, myLocationField, myProjectNameTextField, ProjectUtil.getBaseDir(), "Select Location for Project Directory");
final DirectoryProjectGenerator[] generators = getGenerators();
if (generators.length == 0) {
myProjectTypePanel.setVisible(false);
myGeneratorBeforeSeparator = null;
}
else {
DefaultComboBoxModel model = new DefaultComboBoxModel();
model.addElement(getEmptyProjectGenerator());
List<DirectoryProjectGenerator> primaryGenerators = ContainerUtil.newArrayList();
List<DirectoryProjectGenerator> otherGenerators = ContainerUtil.newArrayList();
for (DirectoryProjectGenerator generator : generators) {
if (generator instanceof HideableProjectGenerator) {
if (((HideableProjectGenerator)generator).isHidden()) {
continue;
}
}
boolean primary = true;
if (generator instanceof WebProjectGenerator) {
primary = ((WebProjectGenerator) generator).isPrimaryGenerator();
}
if (primary) {
primaryGenerators.add(generator);
} else {
otherGenerators.add(generator);
}
}
if (!primaryGenerators.isEmpty() && !otherGenerators.isEmpty()) {
myGeneratorBeforeSeparator = primaryGenerators.get(primaryGenerators.size() - 1);
}
else {
myGeneratorBeforeSeparator = null;
}
for (DirectoryProjectGenerator generator : primaryGenerators) {
model.addElement(generator);
}
for (DirectoryProjectGenerator generator : otherGenerators) {
model.addElement(generator);
}
myProjectTypeComboBox.setModel(model);
myProjectTypeComboBox.setRenderer(createProjectTypeListCellRenderer(myProjectTypeComboBox.getRenderer()));
}
registerValidators(new FacetValidatorsManager() {
public void registerValidator(FacetEditorValidator validator, JComponent... componentsToWatch) {
}
public void validate() {
checkValid();
}
});
}
@NotNull
private ListCellRenderer createProjectTypeListCellRenderer(@NotNull final ListCellRenderer originalRenderer) {
ListCellRenderer intermediate = myGeneratorBeforeSeparator == null ? originalRenderer : new ListCellRenderer() {
private final JSeparator mySeparator = new JSeparator(SwingConstants.HORIZONTAL);
private final JPanel myComponentWithSeparator = new JPanel(new BorderLayout(0, 0));
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component original = originalRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (index != -1 && value == myGeneratorBeforeSeparator
&& value instanceof DirectoryProjectGenerator && original instanceof JLabel) {
myComponentWithSeparator.removeAll();
JLabel label = (JLabel) original;
label.setText(((DirectoryProjectGenerator) value).getName());
myComponentWithSeparator.add(label, BorderLayout.CENTER);
myComponentWithSeparator.add(mySeparator, BorderLayout.SOUTH);
myComponentWithSeparator.revalidate();
myComponentWithSeparator.repaint();
return myComponentWithSeparator;
}
return original;
}
};
return new ListCellRendererWrapper() {
@Override
public void customize(final JList list, final Object value, final int index, final boolean selected, final boolean cellHasFocus) {
if (value == null) return;
if (value == EMPTY_PROJECT_GENERATOR) {
setText("Empty project");
}
else {
setText(((DirectoryProjectGenerator)value).getName());
}
}
};
}
protected Object getEmptyProjectGenerator() {
return EMPTY_PROJECT_GENERATOR;
}
protected DirectoryProjectGenerator[] getGenerators() {
return Extensions.getExtensions(DirectoryProjectGenerator.EP_NAME);
}
protected void checkValid() {
String projectName = myProjectNameTextField.getText();
if (projectName.trim().isEmpty()) {
setOKActionEnabled(false);
setErrorText("Project name can't be empty");
return;
}
if (myLocationField.getText().indexOf('$') >= 0) {
setOKActionEnabled(false);
setErrorText("Project directory name must not contain the $ character");
return;
}
DirectoryProjectGenerator generator = getProjectGenerator();
if (generator != null) {
String baseDirPath = myLocationField.getTextField().getText();
ValidationResult validationResult = generator.validate(baseDirPath);
if (!validationResult.isOk()) {
setOKActionEnabled(false);
setErrorText(validationResult.getErrorMessage());
return;
}
}
setOKActionEnabled(true);
setErrorText(null);
}
private void registerValidators(final FacetValidatorsManager validatorsManager) {
validateOnTextChange(validatorsManager, myLocationField.getTextField());
validateOnSelectionChange(validatorsManager, myProjectTypeComboBox);
}
private static void validateOnSelectionChange(final FacetValidatorsManager validatorsManager, final JComboBox projectNameTextField) {
projectNameTextField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
validatorsManager.validate();
}
});
}
private static void validateOnTextChange(final FacetValidatorsManager validatorsManager, final JTextField textField) {
textField.getDocument().addDocumentListener(new DocumentAdapter() {
@Override
protected void textChanged(DocumentEvent e) {
validatorsManager.validate();
}
});
}
protected JComponent createCenterPanel() {
return myRootPane;
}
public String getNewProjectLocation() {
return myLocationField.getText();
}
public String getNewProjectName() {
return myProjectNameTextField.getText();
}
@Nullable
public DirectoryProjectGenerator getProjectGenerator() {
final Object selItem = myProjectTypeComboBox.getSelectedItem();
if (selItem == EMPTY_PROJECT_GENERATOR) return null;
return (DirectoryProjectGenerator)selItem;
}
public JComponent getPreferredFocusedComponent() {
return myProjectNameTextField;
}
@Override
protected String getHelpId() {
return "create_new_project_dialog";
}
}