blob: ecebf53c3bb23de6b2a102f05d292e258190e09f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.modules.javafx2.project;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import javax.swing.JFileChooser;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectManager;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.spi.project.ui.support.ProjectChooser;
import org.openide.WizardDescriptor;
import org.openide.WizardValidationException;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.NbBundle;
/**
* Sets up source and test folders for new Java project from existing sources.
* @author Tomas Zezula et al.
*/
public class PanelProjectLocationExtSrc extends SettingsPanel {
private PanelConfigureProject firer;
private WizardDescriptor wizardDescriptor;
private boolean calculatePF;
private static final String DEFAULT_BUILD_SCRIPT_NAME = "build.xml"; // NOI18N
private static final String NB_BUILD_SCRIPT_NAME = "nbbuild.xml"; // NOI18N
/** Creates new form PanelSourceFolders */
PanelProjectLocationExtSrc(PanelConfigureProject panel) {
this.firer = panel;
initComponents();
this.projectName.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
calculateProjectFolder();
dataChanged();
firePropertyChange(PanelProjectLocationVisual.PROP_PROJECT_NAME, null, projectName.getText());
}
@Override
public void insertUpdate(DocumentEvent e) {
calculateProjectFolder();
dataChanged();
firePropertyChange(PanelProjectLocationVisual.PROP_PROJECT_NAME, null, projectName.getText());
}
@Override
public void removeUpdate(DocumentEvent e) {
calculateProjectFolder();
dataChanged();
firePropertyChange(PanelProjectLocationVisual.PROP_PROJECT_NAME, null, projectName.getText());
}
});
this.projectLocation.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
setCalculateProjectFolder(false);
checkBuildScriptName();
dataChanged();
firePropertyChange(PanelProjectLocationVisual.PROP_PROJECT_LOCATION, null, projectLocation.getText());
}
@Override
public void insertUpdate(DocumentEvent e) {
setCalculateProjectFolder(false);
checkBuildScriptName();
dataChanged();
firePropertyChange(PanelProjectLocationVisual.PROP_PROJECT_LOCATION, null, projectLocation.getText());
}
@Override
public void removeUpdate(DocumentEvent e) {
setCalculateProjectFolder(false);
checkBuildScriptName();
dataChanged();
firePropertyChange(PanelProjectLocationVisual.PROP_PROJECT_LOCATION, null, projectLocation.getText());
}
});
this.buildScriptName.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
dataChanged();
}
@Override
public void removeUpdate(DocumentEvent e) {
dataChanged();
}
@Override
public void changedUpdate(DocumentEvent e) {
dataChanged();
}
});
}
private synchronized void calculateProjectFolder() {
if (this.calculatePF) {
File f = ProjectChooser.getProjectsFolder();
this.projectLocation.setText(f.getAbsolutePath() + File.separator + this.projectName.getText());
this.calculatePF = true;
}
}
private void checkBuildScriptName() {
if (DEFAULT_BUILD_SCRIPT_NAME.equals(this.buildScriptName.getText())) {
final String path = this.projectLocation.getText();
final File projDir = new File(path);
final File buildScript = new File(projDir, DEFAULT_BUILD_SCRIPT_NAME);
if (buildScript.exists()) {
this.buildScriptName.setText(NB_BUILD_SCRIPT_NAME);
}
}
}
private synchronized void setCalculateProjectFolder(boolean value) {
this.calculatePF = value;
}
private void dataChanged() {
this.firer.fireChangeEvent();
}
@Override
void read(WizardDescriptor settings) {
this.wizardDescriptor = settings;
String path = null;
String projectName = null;
File projectLocation = (File) settings.getProperty("projdir"); // NOI18N
if (projectLocation == null) {
projectLocation = ProjectChooser.getProjectsFolder();
int index = WizardSettings.getNewProjectCount();
String formater = NbBundle.getMessage(PanelSourceFolders.class, "TXT_JavaProject"); // NOI18N
File file;
do {
index++;
projectName = MessageFormat.format(formater, new Object[]{new Integer(index)});
file = new File(projectLocation, projectName);
} while (file.exists());
settings.putProperty(JavaFXProjectWizardIterator.PROP_NAME_INDEX, new Integer(index));
this.projectLocation.setText(projectLocation.getAbsolutePath());
this.setCalculateProjectFolder(true);
} else {
projectName = (String) settings.getProperty("name"); // NOI18N
boolean tmpFlag = this.calculatePF;
this.projectLocation.setText(projectLocation.getAbsolutePath());
this.setCalculateProjectFolder(tmpFlag);
}
this.projectName.setText(projectName);
this.projectName.selectAll();
String buildScriptName = (String) settings.getProperty("buildScriptName"); // NOI18N
if (buildScriptName == null) {
assert projectLocation != null;
buildScriptName = DEFAULT_BUILD_SCRIPT_NAME;
File bf = new File(projectLocation, buildScriptName);
if (bf.exists()) {
buildScriptName = NB_BUILD_SCRIPT_NAME;
}
//Todo: Mybe generate other name, like nb-build2.xml - not sure if it's desirable
}
this.buildScriptName.setText(buildScriptName);
}
@Override
void store(WizardDescriptor settings) {
settings.putProperty("name", this.projectName.getText()); // NOI18N
File projectsDir = new File(this.projectLocation.getText());
settings.putProperty("projdir", projectsDir); // NOI18N
String buildScriptName = this.buildScriptName.getText();
if (DEFAULT_BUILD_SCRIPT_NAME.equals(buildScriptName)) {
buildScriptName = null;
}
settings.putProperty("buildScriptName", buildScriptName); // NOI18N
}
@Override
boolean valid(WizardDescriptor settings) {
String result = checkValidity(this.projectName.getText(), this.projectLocation.getText(), this.buildScriptName.getText());
if (result == null) {
wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, ""); // NOI18N
return true;
} else {
wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, result);
return false;
}
}
static String checkValidity(final String projectName, final String projectLocation, final String buildScriptName) {
if (JavaFXProjectWizardIterator.isIllegalProjectName(projectName)) {
// Display name not specified
return NbBundle.getMessage(PanelSourceFolders.class, "MSG_IllegalProjectName"); // NOI18N
}
File projLoc = new File(projectLocation).getAbsoluteFile();
if (JavaFXProjectWizardIterator.getCanonicalFile(projLoc) == null) {
return NbBundle.getMessage(PanelProjectLocationVisual.class, "MSG_IllegalProjectLocation"); // NOI18N
}
while (projLoc != null && !projLoc.exists()) {
projLoc = projLoc.getParentFile();
}
if (projLoc == null || !projLoc.canWrite()) {
return NbBundle.getMessage(PanelSourceFolders.class, "MSG_ProjectFolderReadOnly"); // NOI18N
}
if (buildScriptName.length() == 0 || buildScriptName.indexOf(File.separatorChar) >= 0 || !buildScriptName.endsWith(".xml")) { //NOI18N
return NbBundle.getMessage(PanelSourceFolders.class, "MSG_WrongBuildScriptName"); // NOI18N
}
File destFolder = FileUtil.normalizeFile(new File(projectLocation));
File[] kids = destFolder.listFiles();
if (destFolder.exists() && kids != null && kids.length > 0) {
String file = null;
for (int i = 0; i < kids.length; i++) {
String childName = kids[i].getName();
if ("nbproject".equals(childName)) { //NOI18N
file = NbBundle.getMessage(PanelSourceFolders.class, "TXT_NetBeansProject"); // NOI18N
} else if ("build".equals(childName)) { //NOI18N
file = NbBundle.getMessage(PanelSourceFolders.class, "TXT_BuildFolder"); // NOI18N
} else if ("dist".equals(childName)) { //NOI18N
file = NbBundle.getMessage(PanelSourceFolders.class, "TXT_DistFolder"); // NOI18N
} else if (buildScriptName.equals(childName)) { //NOI18N
file = NbBundle.getMessage(PanelSourceFolders.class, "TXT_BuildXML"); // NOI18N
}
if (file != null) {
String format = NbBundle.getMessage(PanelSourceFolders.class, "MSG_ProjectFolderInvalid"); // NOI18N
return MessageFormat.format(format, new Object[]{file});
}
}
}
// #47611: if there is a live project still residing here, forbid project creation.
if (destFolder.isDirectory()) {
FileObject destFO = FileUtil.toFileObject(destFolder);
assert destFO != null : "No FileObject for " + destFolder;
Project owner = null;
try {
owner = ProjectManager.getDefault().findProject(destFO);
} catch (IOException e) {
// need not report here; clear remains false -> error
}
if (owner != null) {
return NbBundle.getMessage(PanelSourceFolders.class, "MSG_ProjectFolderHasDeletedProject", ProjectUtils.getInformation(owner).getDisplayName()); // NOI18N
}
}
return null;
}
@Override
void validate(WizardDescriptor settings) throws WizardValidationException {
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jPanel2 = new javax.swing.JPanel();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
projectName = new javax.swing.JTextField();
jLabel6 = new javax.swing.JLabel();
projectLocation = new javax.swing.JTextField();
jButton3 = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
buildScriptName = new javax.swing.JTextField();
jPanel1 = new javax.swing.JPanel();
setLayout(new java.awt.GridBagLayout());
jPanel2.setLayout(new java.awt.GridBagLayout());
jLabel4.setLabelFor(jPanel2);
org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "LBL_ProjectNameAndLocationLabel")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
jPanel2.add(jLabel4, gridBagConstraints);
jLabel4.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSN_jLabel4")); // NOI18N
jLabel4.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSD_jLabel4")); // NOI18N
jLabel5.setLabelFor(projectName);
org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "LBL_NWP1_ProjectName_Label")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(12, 0, 0, 0);
jPanel2.add(jLabel5, gridBagConstraints);
jLabel5.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSN_projectNameLabel")); // NOI18N
jLabel5.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSD_projectNameLabel")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(12, 6, 0, 0);
jPanel2.add(projectName, gridBagConstraints);
jLabel6.setDisplayedMnemonic(org.openide.util.NbBundle.getBundle(PanelProjectLocationExtSrc.class).getString("LBL_NWP1_CreatedProjectFolder_LablelMnemonic").charAt(0));
jLabel6.setLabelFor(projectLocation);
org.openide.awt.Mnemonics.setLocalizedText(jLabel6, org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "LBL_NWP1_CreatedProjectFolder_Lablel")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(12, 0, 0, 0);
jPanel2.add(jLabel6, gridBagConstraints);
jLabel6.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSN_projectLocationLabel")); // NOI18N
jLabel6.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSD_projectLocationLabel")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(12, 6, 0, 0);
jPanel2.add(projectLocation, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(jButton3, org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "LBL_NWP1_BrowseLocation_Button3")); // NOI18N
jButton3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
browseProjectLocation(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(12, 6, 0, 0);
jPanel2.add(jButton3, gridBagConstraints);
jButton3.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSN_browseButton")); // NOI18N
jButton3.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSD_browseButton")); // NOI18N
jLabel1.setLabelFor(buildScriptName);
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "MSG_BuildScriptName")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(12, 0, 0, 0);
jPanel2.add(jLabel1, gridBagConstraints);
jLabel1.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "AD_BuildScriptName")); // NOI18N
buildScriptName.setText("\n");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(12, 6, 0, 0);
jPanel2.add(buildScriptName, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
add(jPanel2, gridBagConstraints);
jPanel1.setLayout(new java.awt.GridBagLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(jPanel1, gridBagConstraints);
jPanel1.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSN_jPanel1")); // NOI18N
jPanel1.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSD_jPanel1")); // NOI18N
getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSN_PanelSourceFolders")); // NOI18N
getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PanelProjectLocationExtSrc.class, "ACSD_PanelSourceFolders")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
private void browseProjectLocation(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseProjectLocation
// TODO add your handling code here:
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle(NbBundle.getMessage(PanelSourceFolders.class, "LBL_NWP1_SelectProjectLocation")); // NOI18N
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
String path = this.projectLocation.getText();
if (path.length() > 0) {
File f = new File(path);
File owner = f.getParentFile();
if (owner.exists()) {
chooser.setCurrentDirectory(owner);
}
if (f.exists()) {
chooser.setSelectedFile(f);
}
}
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
if (file != null) {
this.projectLocation.setText(FileUtil.normalizeFile(file).getAbsolutePath());
}
}
}//GEN-LAST:event_browseProjectLocation
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JTextField buildScriptName;
private javax.swing.JButton jButton3;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTextField projectLocation;
private javax.swing.JTextField projectName;
// End of variables declaration//GEN-END:variables
}