Merge remote-tracking branch 'remotes/origin/master' into upsource-master
[idea/community.git] / java / idea-ui / src / com / intellij / ide / util / projectWizard / ProjectNameStep.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.ide.util.projectWizard;
17
18 import com.intellij.ide.IdeBundle;
19 import com.intellij.ide.highlighter.ModuleFileType;
20 import com.intellij.ide.highlighter.ProjectFileType;
21 import com.intellij.openapi.application.ApplicationInfo;
22 import com.intellij.openapi.application.ApplicationManager;
23 import com.intellij.openapi.options.ConfigurationException;
24 import com.intellij.openapi.project.ProjectCoreUtil;
25 import com.intellij.openapi.ui.Messages;
26 import com.intellij.openapi.util.io.FileUtil;
27 import com.intellij.openapi.util.text.StringUtil;
28 import org.jetbrains.annotations.NonNls;
29
30 import javax.swing.*;
31 import java.awt.*;
32 import java.io.File;
33 import java.util.List;
34
35 import static com.intellij.openapi.components.StorageScheme.DIRECTORY_BASED;
36
37 /**
38  * @author Eugene Zhuravlev
39  *         Date: Jan 21, 2004
40  */
41 public class ProjectNameStep extends ModuleWizardStep {
42   private final NamePathComponent myNamePathComponent;
43   private final JPanel myPanel;
44   private final WizardContext myWizardContext;
45
46   public ProjectNameStep(WizardContext wizardContext) {
47     myWizardContext = wizardContext;
48     myNamePathComponent = new NamePathComponent(IdeBundle.message("label.project.name"), IdeBundle.message("label.component.file.location",
49                                                                                                            StringUtil.capitalize(myWizardContext.getPresentationName())), 'a', 'l',
50                                                 IdeBundle.message("title.select.project.file.directory", myWizardContext.getPresentationName()),
51                                                 IdeBundle.message("description.select.project.file.directory", myWizardContext.getPresentationName()));
52     myPanel = new JPanel(new GridBagLayout());
53     myPanel.setBorder(BorderFactory.createEtchedBorder());
54
55     ApplicationInfo info = ApplicationManager.getApplication().getComponent(ApplicationInfo.class);
56     String appName = info.getVersionName();
57     myPanel.add(new JLabel(IdeBundle.message("label.please.enter.project.name", appName, wizardContext.getPresentationName())),
58                 new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(8, 10, 8, 10), 0, 0));
59
60     myPanel.add(myNamePathComponent, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(8, 10, 8, 10), 0, 0));
61   }
62
63   public JComponent getPreferredFocusedComponent() {
64     return myNamePathComponent.getNameComponent();
65   }
66
67   public String getHelpId() {
68     return "reference.dialogs.new.project.import.name";
69   }
70
71   public JComponent getComponent() {
72     return myPanel;
73   }
74
75   public void updateStep() {
76     super.updateStep();
77     myNamePathComponent.setPath(FileUtil.toSystemDependentName(myWizardContext.getProjectFileDirectory()));
78     String name = myWizardContext.getProjectName();
79     if (name == null) {
80       List<String> components = StringUtil.split(FileUtil.toSystemIndependentName(myWizardContext.getProjectFileDirectory()), "/");
81       if (!components.isEmpty()) {
82         name = components.get(components.size()-1);
83       }
84     }
85     myNamePathComponent.setNameValue(name);
86     if (name != null) {
87       myNamePathComponent.getNameComponent().setSelectionStart(0);
88       myNamePathComponent.getNameComponent().setSelectionEnd(name.length());
89     }
90   }
91
92   public void updateDataModel() {
93     myWizardContext.setProjectName(getProjectName());
94     myWizardContext.setProjectFileDirectory(getProjectFileDirectory());
95   }
96
97   public Icon getIcon() {
98     return myWizardContext.getStepIcon();
99   }
100
101   public boolean validate() throws ConfigurationException {
102     String name = myNamePathComponent.getNameValue();
103     if (name.length() == 0) {
104       final ApplicationInfo info = ApplicationManager.getApplication().getComponent(ApplicationInfo.class);
105       throw new ConfigurationException(IdeBundle.message("prompt.new.project.file.name", info.getVersionName(), myWizardContext.getPresentationName()));
106     }
107
108     final String projectFileDirectory = getProjectFileDirectory();
109     if (projectFileDirectory.length() == 0) {
110       throw new ConfigurationException(IdeBundle.message("prompt.enter.project.file.location", myWizardContext.getPresentationName()));
111     }
112
113     final boolean shouldPromptCreation = myNamePathComponent.isPathChangedByUser();
114     if (!ProjectWizardUtil.createDirectoryIfNotExists(IdeBundle.message("directory.project.file.directory",myWizardContext.getPresentationName()), projectFileDirectory, shouldPromptCreation)) {
115       return false;
116     }
117
118     boolean shouldContinue = true;
119
120     final String path = myWizardContext.isCreatingNewProject() && myWizardContext.getProjectStorageFormat() == DIRECTORY_BASED
121                         ? getProjectFileDirectory() + "/" + ProjectCoreUtil.DIRECTORY_BASED_PROJECT_DIR
122                         : getProjectFilePath();
123     final File projectFile = new File(path);
124     if (projectFile.exists()) {
125       final String title = myWizardContext.isCreatingNewProject()
126                            ? IdeBundle.message("title.new.project")
127                            : IdeBundle.message("title.add.module");
128       final String message = myWizardContext.isCreatingNewProject() && myWizardContext.getProjectStorageFormat() == DIRECTORY_BASED
129                              ? IdeBundle.message("prompt.overwrite.project.folder", ProjectCoreUtil.DIRECTORY_BASED_PROJECT_DIR,
130                                                  projectFile.getParentFile().getAbsolutePath())
131                              : IdeBundle.message("prompt.overwrite.project.file", projectFile.getAbsolutePath(),
132                                                  myWizardContext.getPresentationName());
133       int answer = Messages.showYesNoDialog(message, title, Messages.getQuestionIcon());
134       shouldContinue = answer == 0;
135     }
136
137     return shouldContinue;
138   }
139
140   @NonNls
141   public String getProjectFilePath() {
142     return getProjectFileDirectory() + "/" + myNamePathComponent.getNameValue()/*myTfProjectName.getText().trim()*/ +
143       (myWizardContext.getProject() == null ? ProjectFileType.DOT_DEFAULT_EXTENSION : ModuleFileType.DOT_DEFAULT_EXTENSION);
144   }
145
146   public String getProjectFileDirectory() {
147     return FileUtil.toSystemIndependentName(myNamePathComponent.getPath());
148   }
149
150   public String getProjectName() {
151     return myNamePathComponent.getNameValue();
152   }
153
154   public boolean isStepVisible() {
155     final ProjectBuilder builder = myWizardContext.getProjectBuilder();
156     if (builder != null && builder.isUpdate()) return false;
157     return super.isStepVisible();
158   }
159 }