blob: a053f78bd040e45d92b2f32a2234cc6af9050e9d [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.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.event.ChangeListener;
import org.netbeans.modules.java.api.common.project.ui.wizards.FolderList;
import org.netbeans.spi.project.ui.templates.support.Templates;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.WizardDescriptor;
import org.openide.WizardValidationException;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.ChangeSupport;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
//XXX There should be a way how to add nonexistent test dir
/**
* Sets up name and location for new Java project from existing sources.
* @author Tomas Zezula et al.
*/
public class PanelSourceFolders extends SettingsPanel implements PropertyChangeListener {
private Panel firer;
private WizardDescriptor wizardDescriptor;
// key to action value that influence folder list current directory
public static final String INITIAL_SOURCE_ROOT = "EXISTING_SOURCES_CURRENT_DIRECTORY"; // NOI18N
/** Creates new form PanelSourceFolders */
private PanelSourceFolders(Panel panel) {
this.firer = panel;
initComponents();
this.setName(NbBundle.getMessage(PanelConfigureProjectVisual.class, "LAB_ConfigureSourceRoots")); // NOI18N
this.putClientProperty("NewProjectWizard_Title", NbBundle.getMessage(PanelSourceFolders.class, "TXT_JavaExtSourcesProjectLocation")); // NOI18N
this.getAccessibleContext().setAccessibleName(NbBundle.getMessage(PanelSourceFolders.class, "AN_PanelSourceFolders")); // NOI18N
this.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(PanelSourceFolders.class, "AD_PanelSourceFolders")); // NOI18N
this.sourcePanel.addPropertyChangeListener(this);
this.testsPanel.addPropertyChangeListener(this);
((FolderList) this.sourcePanel).setRelatedFolderList((FolderList) this.testsPanel, FolderList.testRootsFilter());
((FolderList) this.testsPanel).setRelatedFolderList((FolderList) this.sourcePanel);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (FolderList.PROP_FILES.equals(evt.getPropertyName())) {
this.dataChanged();
} else if (FolderList.PROP_LAST_USED_DIR.equals(evt.getPropertyName())) {
if (evt.getSource() == this.sourcePanel) {
((FolderList) this.testsPanel).setLastUsedDir((File) evt.getNewValue());
} else if (evt.getSource() == this.testsPanel) {
((FolderList) this.sourcePanel).setLastUsedDir((File) evt.getNewValue());
}
}
}
private void dataChanged() {
this.firer.fireChangeEvent();
}
@Override
void read(WizardDescriptor settings) {
this.wizardDescriptor = settings;
File projectLocation = (File) settings.getProperty("projdir"); // NOI18N
((FolderList) this.sourcePanel).setProjectFolder(projectLocation);
((FolderList) this.testsPanel).setProjectFolder(projectLocation);
File[] srcRoot = (File[]) settings.getProperty("sourceRoot"); // NOI18N
assert srcRoot != null : "sourceRoot property must be initialized!"; // NOI18N
((FolderList) this.sourcePanel).setFiles(srcRoot);
File[] testRoot = (File[]) settings.getProperty("testRoot"); // NOI18N
assert testRoot != null : "testRoot property must be initialized!"; // NOI18N
((FolderList) this.testsPanel).setFiles(testRoot);
// #58489 honor existing source folder
File currentDirectory = null;
FileObject folder = Templates.getExistingSourcesFolder(wizardDescriptor);
if (folder != null) {
currentDirectory = FileUtil.toFile(folder);
}
if (currentDirectory != null && currentDirectory.isDirectory()) {
((FolderList) sourcePanel).setLastUsedDir(currentDirectory);
((FolderList) testsPanel).setLastUsedDir(currentDirectory);
}
}
@Override
void store(WizardDescriptor settings) {
File[] sourceRoots = ((FolderList) this.sourcePanel).getFiles();
File[] testRoots = ((FolderList) this.testsPanel).getFiles();
settings.putProperty("sourceRoot", sourceRoots); // NOI18N
settings.putProperty("testRoot", testRoots); // NOI18N
}
@Override
boolean valid(WizardDescriptor settings) {
File projectLocation = (File) settings.getProperty("projdir"); // NOI18N
File[] sourceRoots = ((FolderList) this.sourcePanel).getFiles();
File[] testRoots = ((FolderList) this.testsPanel).getFiles();
String result = checkValidity(projectLocation, sourceRoots, testRoots);
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 File projectLocation, final File[] sources, final File[] tests) {
String ploc = projectLocation.getAbsolutePath();
for (int i = 0; i < sources.length; i++) {
if (!sources[i].isDirectory() || !sources[i].canRead()) {
return MessageFormat.format(NbBundle.getMessage(PanelSourceFolders.class, "MSG_IllegalSources"), // NOI18N
new Object[]{sources[i].getAbsolutePath()});
}
String sloc = sources[i].getAbsolutePath();
if (ploc.equals(sloc) || ploc.startsWith(sloc + File.separatorChar)) {
return NbBundle.getMessage(PanelSourceFolders.class, "MSG_IllegalProjectFolder"); // NOI18N
}
}
for (int i = 0; i < tests.length; i++) {
if (!tests[i].isDirectory() || !tests[i].canRead()) {
return MessageFormat.format(NbBundle.getMessage(PanelSourceFolders.class, "MSG_IllegalTests"), // NOI18N
new Object[]{sources[i].getAbsolutePath()});
}
String tloc = tests[i].getAbsolutePath();
if (ploc.equals(tloc) || ploc.startsWith(tloc + File.separatorChar)) {
return NbBundle.getMessage(PanelSourceFolders.class, "MSG_IllegalProjectFolder"); // NOI18N
}
}
return null;
}
@Override
void validate(WizardDescriptor d) throws WizardValidationException {
// sources root
searchClassFiles(((FolderList) this.sourcePanel).getFiles());
// test root, not asked in issue 48198
//searchClassFiles (FileUtil.toFileObject (FileUtil.normalizeFile(new File (tests.getText ()))));
}
private static void findClassFiles(File folder, List<File> files) {
File[] kids = folder.listFiles();
if (kids == null) {
return;
}
for (File kid : kids) {
if (kid.isFile() && kid.getName().endsWith(".class")) { // NOI18N
files.add(kid);
} else if (kid.isDirectory()) {
findClassFiles(kid, files);
}
}
}
private void searchClassFiles(File[] folders) throws WizardValidationException {
List<File> classFiles = new ArrayList<File>();
for (File folder : folders) {
findClassFiles(folder, classFiles);
}
if (!classFiles.isEmpty()) {
JButton DELETE_OPTION = new JButton(NbBundle.getMessage(PanelSourceFolders.class, "TXT_DeleteOption")); // NOI18N
JButton KEEP_OPTION = new JButton(NbBundle.getMessage(PanelSourceFolders.class, "TXT_KeepOption")); // NOI18N
JButton CANCEL_OPTION = new JButton(NbBundle.getMessage(PanelSourceFolders.class, "TXT_CancelOption")); // NOI18N
KEEP_OPTION.setMnemonic(NbBundle.getMessage(PanelSourceFolders.class, "MNE_KeepOption").charAt(0)); // NOI18N
DELETE_OPTION.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(PanelSourceFolders.class, "AD_DeleteOption")); // NOI18N
KEEP_OPTION.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(PanelSourceFolders.class, "AD_KeepOption")); // NOI18N
CANCEL_OPTION.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(PanelSourceFolders.class, "AD_CancelOption")); // NOI18N
NotifyDescriptor desc = new NotifyDescriptor(
NbBundle.getMessage(PanelSourceFolders.class, "MSG_FoundClassFiles"), // NOI18N
NbBundle.getMessage(PanelSourceFolders.class, "MSG_FoundClassFiles_Title"), // NOI18N
NotifyDescriptor.YES_NO_CANCEL_OPTION,
NotifyDescriptor.QUESTION_MESSAGE,
new Object[]{DELETE_OPTION, KEEP_OPTION, CANCEL_OPTION},
DELETE_OPTION);
Object result = DialogDisplayer.getDefault().notify(desc);
if (DELETE_OPTION.equals(result)) {
for (File f : classFiles) {
f.delete(); // ignore if fails
}
} else if (!KEEP_OPTION.equals(result)) {
// cancel, back to wizard
throw new WizardValidationException(this.sourcePanel, "", ""); // NOI18N
}
}
}
/** 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;
jLabel3 = new javax.swing.JLabel();
sourcePanel = new FolderList (NbBundle.getMessage(PanelSourceFolders.class,"CTL_SourceRoots"), NbBundle.getMessage(PanelSourceFolders.class,"MNE_SourceRoots").charAt(0),NbBundle.getMessage(PanelSourceFolders.class,"AD_SourceRoots"), NbBundle.getMessage(PanelSourceFolders.class,"CTL_AddSourceRoot"),
NbBundle.getMessage(PanelSourceFolders.class,"MNE_AddSourceFolder").charAt(0), NbBundle.getMessage(PanelSourceFolders.class,"AD_AddSourceFolder"),NbBundle.getMessage(PanelSourceFolders.class,"MNE_RemoveSourceFolder").charAt(0), NbBundle.getMessage(PanelSourceFolders.class,"AD_RemoveSourceFolder"));
testsPanel = new FolderList (NbBundle.getMessage(PanelSourceFolders.class,"CTL_TestRoots"), NbBundle.getMessage(PanelSourceFolders.class,"MNE_TestRoots").charAt(0),NbBundle.getMessage(PanelSourceFolders.class,"AD_TestRoots"), NbBundle.getMessage(PanelSourceFolders.class,"CTL_AddTestRoot"),
NbBundle.getMessage(PanelSourceFolders.class,"MNE_AddTestFolder").charAt(0), NbBundle.getMessage(PanelSourceFolders.class,"AD_AddTestFolder"),NbBundle.getMessage(PanelSourceFolders.class,"MNE_RemoveTestFolder").charAt(0), NbBundle.getMessage(PanelSourceFolders.class,"AD_RemoveTestFolder"));
jLabel2 = new javax.swing.JLabel();
setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(PanelSourceFolders.class, "LBL_SourceDirectoriesLabel")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(jLabel3, gridBagConstraints);
jLabel3.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getBundle(PanelSourceFolders.class).getString("ACSN_jLabel3")); // NOI18N
jLabel3.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getBundle(PanelSourceFolders.class).getString("ACSD_jLabel3")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 0.45;
gridBagConstraints.insets = new java.awt.Insets(12, 0, 0, 0);
add(sourcePanel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 0.45;
gridBagConstraints.insets = new java.awt.Insets(12, 0, 0, 0);
add(testsPanel, gridBagConstraints);
jLabel2.setText(org.openide.util.NbBundle.getMessage(PanelSourceFolders.class, "TXT_MoveRootDescription")); // 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.insets = new java.awt.Insets(12, 0, 0, 0);
add(jLabel2, gridBagConstraints);
getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PanelSourceFolders.class, "ACSN_PanelSourceFolders")); // NOI18N
getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(PanelSourceFolders.class, "ACSD_PanelSourceFolders")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel sourcePanel;
private javax.swing.JPanel testsPanel;
// End of variables declaration//GEN-END:variables
static class Panel implements WizardDescriptor.ValidatingPanel, WizardDescriptor.FinishablePanel {
private final ChangeSupport changeSupport = new ChangeSupport(this);
private PanelSourceFolders component;
private WizardDescriptor settings;
@Override
public void removeChangeListener(ChangeListener l) {
changeSupport.removeChangeListener(l);
}
@Override
public void addChangeListener(ChangeListener l) {
changeSupport.addChangeListener(l);
}
@Override
public void readSettings(Object settings) {
this.settings = (WizardDescriptor) settings;
this.component.read(this.settings);
// XXX hack, TemplateWizard in final setTemplateImpl() forces new wizard's title
// this name is used in NewProjectWizard to modify the title
Object substitute = component.getClientProperty("NewProjectWizard_Title"); // NOI18N
if (substitute != null) {
this.settings.putProperty("NewProjectWizard_Title", substitute); // NOI18N
}
}
@Override
public void storeSettings(Object settings) {
this.component.store(this.settings);
}
@Override
public void validate() throws WizardValidationException {
this.component.validate(this.settings);
}
@Override
public boolean isValid() {
return this.component.valid(this.settings);
}
@Override
public synchronized java.awt.Component getComponent() {
if (this.component == null) {
this.component = new PanelSourceFolders(this);
}
return this.component;
}
@Override
public HelpCtx getHelp() {
return null;
}
private void fireChangeEvent() {
changeSupport.fireChange();
}
@Override
public boolean isFinishPanel() {
return true;
}
}
}