Add sdk template for jME3 Test classes configured to run as an Android project.
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10387 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
343f9fd08e
commit
d3426d8f5e
@ -5,3 +5,4 @@ OpenIDE-Module-Long-Description=\
|
|||||||
OpenIDE-Module-Name=Project Templates
|
OpenIDE-Module-Name=Project Templates
|
||||||
OpenIDE-Module-Short-Description=Provides Project Templates
|
OpenIDE-Module-Short-Description=Provides Project Templates
|
||||||
Templates/Project/JME3/BasicGameProject.zip=BasicGame
|
Templates/Project/JME3/BasicGameProject.zip=BasicGame
|
||||||
|
Templates/Project/JME3/JME3TestsAndroidProject.zip=jME3TestsAndroid
|
||||||
|
BIN
sdk/jme3-templates/src/com/jme3/gde/templates/Phone_16.gif
Normal file
BIN
sdk/jme3-templates/src/com/jme3/gde/templates/Phone_16.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 85 B |
@ -12,6 +12,13 @@
|
|||||||
<attr name="instantiatingWizardURL" urlvalue="nbresloc:/com/jme3/gde/templates/basic/BasicGameDescription.html"/>
|
<attr name="instantiatingWizardURL" urlvalue="nbresloc:/com/jme3/gde/templates/basic/BasicGameDescription.html"/>
|
||||||
<attr name="template" boolvalue="true"/>
|
<attr name="template" boolvalue="true"/>
|
||||||
</file>
|
</file>
|
||||||
|
<file name="JME3TestsAndroidProject.zip" url="JME3TestsAndroidProject.zip">
|
||||||
|
<attr name="SystemFileSystem.icon" urlvalue="nbresloc:/com/jme3/gde/templates/Phone_16.gif"/>
|
||||||
|
<attr name="displayName" bundlevalue="com.jme3.gde.templates.Bundle#Templates/Project/JME3/JME3TestsAndroidProject.zip"/>
|
||||||
|
<attr name="instantiatingIterator" methodvalue="com.jme3.gde.templates.testsandroid.JME3TestsAndroidWizardIterator.createIterator"/>
|
||||||
|
<attr name="instantiatingWizardURL" urlvalue="nbresloc:/com/jme3/gde/templates/testsandroid/JME3TestsAndroidDescription.html"/>
|
||||||
|
<attr name="template" boolvalue="true"/>
|
||||||
|
</file>
|
||||||
</folder>
|
</folder>
|
||||||
</folder>
|
</folder>
|
||||||
<folder name="JME3 Classes">
|
<folder name="JME3 Classes">
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
LBL_CreateProjectStep=Name and Location
|
||||||
|
JME3TestsAndroidPanelVisual.browseButton.text=Br&owse...
|
||||||
|
JME3TestsAndroidPanelVisual.createdFolderLabel.text=Project &Folder:
|
||||||
|
JME3TestsAndroidPanelVisual.projectNameLabel.text=Project &Name:
|
||||||
|
JME3TestsAndroidPanelVisual.projectLocationLabel.text=Project &Location:
|
||||||
|
JME3TestsAndroidPanelVisual.browseButton.actionCommand=BROWSE
|
@ -0,0 +1,12 @@
|
|||||||
|
<!--
|
||||||
|
To change this template, choose Tools | Templates
|
||||||
|
and open the template in the editor.
|
||||||
|
-->
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
Sample jME3 Tests Template for Android project
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,122 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="projectNameLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="projectLocationLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="createdFolderLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="projectNameTextField" alignment="1" pref="191" max="32767" attributes="0"/>
|
||||||
|
<Component id="projectLocationTextField" alignment="1" pref="191" max="32767" attributes="0"/>
|
||||||
|
<Component id="createdFolderTextField" alignment="1" pref="191" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="browseButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="projectNameLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="projectNameTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="projectLocationLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="projectLocationTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="browseButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="createdFolderLabel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="createdFolderTextField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace pref="213" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JLabel" name="projectNameLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="labelFor" type="java.awt.Component" editor="org.netbeans.modules.form.ComponentChooserEditor">
|
||||||
|
<ComponentRef name="projectNameTextField"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="com/jme3/gde/templates/testsandroid/Bundle.properties" key="JME3TestsAndroidPanelVisual.projectNameLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="projectNameTextField">
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="projectLocationLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="labelFor" type="java.awt.Component" editor="org.netbeans.modules.form.ComponentChooserEditor">
|
||||||
|
<ComponentRef name="projectLocationTextField"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="com/jme3/gde/templates/testsandroid/Bundle.properties" key="JME3TestsAndroidPanelVisual.projectLocationLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="projectLocationTextField">
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="browseButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="com/jme3/gde/templates/testsandroid/Bundle.properties" key="JME3TestsAndroidPanelVisual.browseButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="com/jme3/gde/templates/testsandroid/Bundle.properties" key="JME3TestsAndroidPanelVisual.browseButton.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="browseButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="createdFolderLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="labelFor" type="java.awt.Component" editor="org.netbeans.modules.form.ComponentChooserEditor">
|
||||||
|
<ComponentRef name="createdFolderTextField"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="com/jme3/gde/templates/testsandroid/Bundle.properties" key="JME3TestsAndroidPanelVisual.createdFolderLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="createdFolderTextField">
|
||||||
|
<Properties>
|
||||||
|
<Property name="editable" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
@ -0,0 +1,262 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package com.jme3.gde.templates.testsandroid;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import javax.swing.JFileChooser;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.event.DocumentEvent;
|
||||||
|
import javax.swing.event.DocumentListener;
|
||||||
|
import javax.swing.text.Document;
|
||||||
|
import org.netbeans.spi.project.ui.support.ProjectChooser;
|
||||||
|
import org.openide.WizardDescriptor;
|
||||||
|
import org.openide.WizardValidationException;
|
||||||
|
import org.openide.filesystems.FileUtil;
|
||||||
|
|
||||||
|
public class JME3TestsAndroidPanelVisual extends JPanel implements DocumentListener {
|
||||||
|
|
||||||
|
public static final String PROP_PROJECT_NAME = "projectName";
|
||||||
|
private JME3TestsAndroidWizardPanel panel;
|
||||||
|
|
||||||
|
public JME3TestsAndroidPanelVisual(JME3TestsAndroidWizardPanel panel) {
|
||||||
|
initComponents();
|
||||||
|
this.panel = panel;
|
||||||
|
// Register listener on the textFields to make the automatic updates
|
||||||
|
projectNameTextField.getDocument().addDocumentListener(this);
|
||||||
|
projectLocationTextField.getDocument().addDocumentListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProjectName() {
|
||||||
|
return this.projectNameTextField.getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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() {
|
||||||
|
|
||||||
|
projectNameLabel = new javax.swing.JLabel();
|
||||||
|
projectNameTextField = new javax.swing.JTextField();
|
||||||
|
projectLocationLabel = new javax.swing.JLabel();
|
||||||
|
projectLocationTextField = new javax.swing.JTextField();
|
||||||
|
browseButton = new javax.swing.JButton();
|
||||||
|
createdFolderLabel = new javax.swing.JLabel();
|
||||||
|
createdFolderTextField = new javax.swing.JTextField();
|
||||||
|
|
||||||
|
projectNameLabel.setLabelFor(projectNameTextField);
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(projectNameLabel, org.openide.util.NbBundle.getMessage(JME3TestsAndroidPanelVisual.class, "JME3TestsAndroidPanelVisual.projectNameLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
projectLocationLabel.setLabelFor(projectLocationTextField);
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(projectLocationLabel, org.openide.util.NbBundle.getMessage(JME3TestsAndroidPanelVisual.class, "JME3TestsAndroidPanelVisual.projectLocationLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(browseButton, org.openide.util.NbBundle.getMessage(JME3TestsAndroidPanelVisual.class, "JME3TestsAndroidPanelVisual.browseButton.text")); // NOI18N
|
||||||
|
browseButton.setActionCommand(org.openide.util.NbBundle.getMessage(JME3TestsAndroidPanelVisual.class, "JME3TestsAndroidPanelVisual.browseButton.actionCommand")); // NOI18N
|
||||||
|
browseButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
browseButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
createdFolderLabel.setLabelFor(createdFolderTextField);
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(createdFolderLabel, org.openide.util.NbBundle.getMessage(JME3TestsAndroidPanelVisual.class, "JME3TestsAndroidPanelVisual.createdFolderLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
createdFolderTextField.setEditable(false);
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
|
this.setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(projectNameLabel)
|
||||||
|
.addComponent(projectLocationLabel)
|
||||||
|
.addComponent(createdFolderLabel))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(projectNameTextField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE)
|
||||||
|
.addComponent(projectLocationTextField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE)
|
||||||
|
.addComponent(createdFolderTextField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 191, Short.MAX_VALUE))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(browseButton)
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(projectNameLabel)
|
||||||
|
.addComponent(projectNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(projectLocationLabel)
|
||||||
|
.addComponent(projectLocationTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addComponent(browseButton))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(createdFolderLabel)
|
||||||
|
.addComponent(createdFolderTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addContainerGap(213, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed
|
||||||
|
String command = evt.getActionCommand();
|
||||||
|
if ("BROWSE".equals(command)) {
|
||||||
|
JFileChooser chooser = new JFileChooser();
|
||||||
|
FileUtil.preventFileChooserSymlinkTraversal(chooser, null);
|
||||||
|
chooser.setDialogTitle("Select Project Location");
|
||||||
|
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
|
||||||
|
String path = this.projectLocationTextField.getText();
|
||||||
|
if (path.length() > 0) {
|
||||||
|
File f = new File(path);
|
||||||
|
if (f.exists()) {
|
||||||
|
chooser.setSelectedFile(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (JFileChooser.APPROVE_OPTION == chooser.showOpenDialog(this)) {
|
||||||
|
File projectDir = chooser.getSelectedFile();
|
||||||
|
projectLocationTextField.setText(FileUtil.normalizeFile(projectDir).getAbsolutePath());
|
||||||
|
}
|
||||||
|
panel.fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
}//GEN-LAST:event_browseButtonActionPerformed
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
javax.swing.JButton browseButton;
|
||||||
|
javax.swing.JLabel createdFolderLabel;
|
||||||
|
javax.swing.JTextField createdFolderTextField;
|
||||||
|
javax.swing.JLabel projectLocationLabel;
|
||||||
|
javax.swing.JTextField projectLocationTextField;
|
||||||
|
javax.swing.JLabel projectNameLabel;
|
||||||
|
javax.swing.JTextField projectNameTextField;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addNotify() {
|
||||||
|
super.addNotify();
|
||||||
|
//same problem as in 31086, initial focus on Cancel button
|
||||||
|
projectNameTextField.requestFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean valid(WizardDescriptor wizardDescriptor) {
|
||||||
|
|
||||||
|
if (projectNameTextField.getText().length() == 0) {
|
||||||
|
// TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_ERROR_MESSAGE:
|
||||||
|
wizardDescriptor.putProperty("WizardPanel_errorMessage",
|
||||||
|
"Project Name is not a valid folder name.");
|
||||||
|
return false; // Display name not specified
|
||||||
|
}
|
||||||
|
File f = FileUtil.normalizeFile(new File(projectLocationTextField.getText()).getAbsoluteFile());
|
||||||
|
if (!f.isDirectory()) {
|
||||||
|
String message = "Project Folder is not a valid path.";
|
||||||
|
wizardDescriptor.putProperty("WizardPanel_errorMessage", message);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final File destFolder = FileUtil.normalizeFile(new File(createdFolderTextField.getText()).getAbsoluteFile());
|
||||||
|
|
||||||
|
File projLoc = destFolder;
|
||||||
|
while (projLoc != null && !projLoc.exists()) {
|
||||||
|
projLoc = projLoc.getParentFile();
|
||||||
|
}
|
||||||
|
if (projLoc == null || !projLoc.canWrite()) {
|
||||||
|
wizardDescriptor.putProperty("WizardPanel_errorMessage",
|
||||||
|
"Project Folder cannot be created.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FileUtil.toFileObject(projLoc) == null) {
|
||||||
|
String message = "Project Folder is not a valid path.";
|
||||||
|
wizardDescriptor.putProperty("WizardPanel_errorMessage", message);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
File[] kids = destFolder.listFiles();
|
||||||
|
if (destFolder.exists() && kids != null && kids.length > 0) {
|
||||||
|
// Folder exists and is not empty
|
||||||
|
wizardDescriptor.putProperty("WizardPanel_errorMessage",
|
||||||
|
"Project Folder already exists and is not empty.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
wizardDescriptor.putProperty("WizardPanel_errorMessage", "");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void store(WizardDescriptor d) {
|
||||||
|
String name = projectNameTextField.getText().trim();
|
||||||
|
String folder = createdFolderTextField.getText().trim();
|
||||||
|
|
||||||
|
d.putProperty("projdir", new File(folder));
|
||||||
|
d.putProperty("name", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void read(WizardDescriptor settings) {
|
||||||
|
File projectLocation = (File) settings.getProperty("projdir");
|
||||||
|
if (projectLocation == null || projectLocation.getParentFile() == null || !projectLocation.getParentFile().isDirectory()) {
|
||||||
|
projectLocation = ProjectChooser.getProjectsFolder();
|
||||||
|
} else {
|
||||||
|
projectLocation = projectLocation.getParentFile();
|
||||||
|
}
|
||||||
|
this.projectLocationTextField.setText(projectLocation.getAbsolutePath());
|
||||||
|
|
||||||
|
String projectName = (String) settings.getProperty("name");
|
||||||
|
if (projectName == null) {
|
||||||
|
projectName = "JME3TestsAndroid";
|
||||||
|
}
|
||||||
|
this.projectNameTextField.setText(projectName);
|
||||||
|
this.projectNameTextField.selectAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
void validate(WizardDescriptor d) throws WizardValidationException {
|
||||||
|
// nothing to validate
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implementation of DocumentListener --------------------------------------
|
||||||
|
public void changedUpdate(DocumentEvent e) {
|
||||||
|
updateTexts(e);
|
||||||
|
if (this.projectNameTextField.getDocument() == e.getDocument()) {
|
||||||
|
firePropertyChange(PROP_PROJECT_NAME, null, this.projectNameTextField.getText());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insertUpdate(DocumentEvent e) {
|
||||||
|
updateTexts(e);
|
||||||
|
if (this.projectNameTextField.getDocument() == e.getDocument()) {
|
||||||
|
firePropertyChange(PROP_PROJECT_NAME, null, this.projectNameTextField.getText());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeUpdate(DocumentEvent e) {
|
||||||
|
updateTexts(e);
|
||||||
|
if (this.projectNameTextField.getDocument() == e.getDocument()) {
|
||||||
|
firePropertyChange(PROP_PROJECT_NAME, null, this.projectNameTextField.getText());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles changes in the Project name and project directory,
|
||||||
|
*/
|
||||||
|
private void updateTexts(DocumentEvent e) {
|
||||||
|
|
||||||
|
Document doc = e.getDocument();
|
||||||
|
|
||||||
|
if (doc == projectNameTextField.getDocument() || doc == projectLocationTextField.getDocument()) {
|
||||||
|
// Change in the project name
|
||||||
|
|
||||||
|
String projectName = projectNameTextField.getText();
|
||||||
|
String projectFolder = projectLocationTextField.getText();
|
||||||
|
|
||||||
|
//if (projectFolder.trim().length() == 0 || projectFolder.equals(oldName)) {
|
||||||
|
createdFolderTextField.setText(projectFolder + File.separatorChar + projectName);
|
||||||
|
//}
|
||||||
|
|
||||||
|
}
|
||||||
|
panel.fireChangeEvent(); // Notify that the panel changed
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,247 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2010 jMonkeyEngine
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package com.jme3.gde.templates.testsandroid;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.event.ChangeListener;
|
||||||
|
import org.netbeans.api.project.ProjectManager;
|
||||||
|
import org.netbeans.spi.project.ui.support.ProjectChooser;
|
||||||
|
import org.netbeans.spi.project.ui.templates.support.Templates;
|
||||||
|
import org.openide.WizardDescriptor;
|
||||||
|
import org.openide.filesystems.FileObject;
|
||||||
|
import org.openide.filesystems.FileUtil;
|
||||||
|
import org.openide.util.Exceptions;
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
import org.openide.xml.XMLUtil;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
|
||||||
|
public class JME3TestsAndroidWizardIterator implements WizardDescriptor./*Progress*/InstantiatingIterator {
|
||||||
|
|
||||||
|
private int index;
|
||||||
|
private WizardDescriptor.Panel[] panels;
|
||||||
|
private WizardDescriptor wiz;
|
||||||
|
|
||||||
|
public JME3TestsAndroidWizardIterator() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JME3TestsAndroidWizardIterator createIterator() {
|
||||||
|
return new JME3TestsAndroidWizardIterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
private WizardDescriptor.Panel[] createPanels() {
|
||||||
|
return new WizardDescriptor.Panel[]{
|
||||||
|
new JME3TestsAndroidWizardPanel(),};
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] createSteps() {
|
||||||
|
return new String[]{
|
||||||
|
NbBundle.getMessage(JME3TestsAndroidWizardIterator.class, "LBL_CreateProjectStep")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set/*<FileObject>*/ instantiate(/*ProgressHandle handle*/) throws IOException {
|
||||||
|
Set<FileObject> resultSet = new LinkedHashSet<FileObject>();
|
||||||
|
File dirF = FileUtil.normalizeFile((File) wiz.getProperty("projdir"));
|
||||||
|
dirF.mkdirs();
|
||||||
|
|
||||||
|
FileObject template = Templates.getTemplate(wiz);
|
||||||
|
FileObject dir = FileUtil.toFileObject(dirF);
|
||||||
|
unZipFile(template.getInputStream(), dir);
|
||||||
|
|
||||||
|
// Always open top dir as a project:
|
||||||
|
resultSet.add(dir);
|
||||||
|
// Look for nested projects to open as well:
|
||||||
|
Enumeration<? extends FileObject> e = dir.getFolders(true);
|
||||||
|
while (e.hasMoreElements()) {
|
||||||
|
FileObject subfolder = e.nextElement();
|
||||||
|
if (ProjectManager.getDefault().isProject(subfolder)) {
|
||||||
|
resultSet.add(subfolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
File parent = dirF.getParentFile();
|
||||||
|
if (parent != null && parent.exists()) {
|
||||||
|
ProjectChooser.setProjectsFolder(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initialize(WizardDescriptor wiz) {
|
||||||
|
this.wiz = wiz;
|
||||||
|
index = 0;
|
||||||
|
panels = createPanels();
|
||||||
|
// Make sure list of steps is accurate.
|
||||||
|
String[] steps = createSteps();
|
||||||
|
for (int i = 0; i < panels.length; i++) {
|
||||||
|
Component c = panels[i].getComponent();
|
||||||
|
if (steps[i] == null) {
|
||||||
|
// Default step name to component name of panel.
|
||||||
|
// Mainly useful for getting the name of the target
|
||||||
|
// chooser to appear in the list of steps.
|
||||||
|
steps[i] = c.getName();
|
||||||
|
}
|
||||||
|
if (c instanceof JComponent) { // assume Swing components
|
||||||
|
JComponent jc = (JComponent) c;
|
||||||
|
// Step #.
|
||||||
|
// TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*:
|
||||||
|
jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i));
|
||||||
|
// Step name (actually the whole list for reference).
|
||||||
|
jc.putClientProperty("WizardPanel_contentData", steps);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uninitialize(WizardDescriptor wiz) {
|
||||||
|
this.wiz.putProperty("projdir", null);
|
||||||
|
this.wiz.putProperty("name", null);
|
||||||
|
this.wiz = null;
|
||||||
|
panels = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String name() {
|
||||||
|
return MessageFormat.format("{0} of {1}",
|
||||||
|
new Object[]{new Integer(index + 1), new Integer(panels.length)});
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasNext() {
|
||||||
|
return index < panels.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasPrevious() {
|
||||||
|
return index > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void nextPanel() {
|
||||||
|
if (!hasNext()) {
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void previousPanel() {
|
||||||
|
if (!hasPrevious()) {
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
}
|
||||||
|
index--;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WizardDescriptor.Panel current() {
|
||||||
|
return panels[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
// If nothing unusual changes in the middle of the wizard, simply:
|
||||||
|
public final void addChangeListener(ChangeListener l) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void removeChangeListener(ChangeListener l) {
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void unZipFile(InputStream source, FileObject projectRoot) throws IOException {
|
||||||
|
try {
|
||||||
|
ZipInputStream str = new ZipInputStream(source);
|
||||||
|
ZipEntry entry;
|
||||||
|
while ((entry = str.getNextEntry()) != null) {
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
FileUtil.createFolder(projectRoot, entry.getName());
|
||||||
|
} else {
|
||||||
|
FileObject fo = FileUtil.createData(projectRoot, entry.getName());
|
||||||
|
if ("nbproject/project.xml".equals(entry.getName())) {
|
||||||
|
// Special handling for setting name of Ant-based projects; customize as needed:
|
||||||
|
filterProjectXML(fo, str, projectRoot.getName());
|
||||||
|
} else {
|
||||||
|
writeFile(str, fo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
source.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void writeFile(ZipInputStream str, FileObject fo) throws IOException {
|
||||||
|
OutputStream out = fo.getOutputStream();
|
||||||
|
try {
|
||||||
|
FileUtil.copy(str, out);
|
||||||
|
} finally {
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void filterProjectXML(FileObject fo, ZipInputStream str, String name) throws IOException {
|
||||||
|
try {
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
FileUtil.copy(str, baos);
|
||||||
|
Document doc = XMLUtil.parse(new InputSource(new ByteArrayInputStream(baos.toByteArray())), false, false, null, null);
|
||||||
|
NodeList nl = doc.getDocumentElement().getElementsByTagName("name");
|
||||||
|
if (nl != null) {
|
||||||
|
for (int i = 0; i < nl.getLength(); i++) {
|
||||||
|
Element el = (Element) nl.item(i);
|
||||||
|
if (el.getParentNode() != null && "data".equals(el.getParentNode().getNodeName())) {
|
||||||
|
NodeList nl2 = el.getChildNodes();
|
||||||
|
if (nl2.getLength() > 0) {
|
||||||
|
nl2.item(0).setNodeValue(name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OutputStream out = fo.getOutputStream();
|
||||||
|
try {
|
||||||
|
XMLUtil.write(doc, out, "UTF-8");
|
||||||
|
} finally {
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Exceptions.printStackTrace(ex);
|
||||||
|
writeFile(str, fo);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2010 jMonkeyEngine
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package com.jme3.gde.templates.testsandroid;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import javax.swing.event.ChangeEvent;
|
||||||
|
import javax.swing.event.ChangeListener;
|
||||||
|
import org.openide.WizardDescriptor;
|
||||||
|
import org.openide.WizardValidationException;
|
||||||
|
import org.openide.util.HelpCtx;
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Panel just asking for basic info.
|
||||||
|
*/
|
||||||
|
public class JME3TestsAndroidWizardPanel implements WizardDescriptor.Panel,
|
||||||
|
WizardDescriptor.ValidatingPanel, WizardDescriptor.FinishablePanel {
|
||||||
|
|
||||||
|
private WizardDescriptor wizardDescriptor;
|
||||||
|
private JME3TestsAndroidPanelVisual component;
|
||||||
|
|
||||||
|
public JME3TestsAndroidWizardPanel() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Component getComponent() {
|
||||||
|
if (component == null) {
|
||||||
|
component = new JME3TestsAndroidPanelVisual(this);
|
||||||
|
component.setName(NbBundle.getMessage(JME3TestsAndroidWizardPanel.class, "LBL_CreateProjectStep"));
|
||||||
|
}
|
||||||
|
return component;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HelpCtx getHelp() {
|
||||||
|
return new HelpCtx("sdk.project_creation");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isValid() {
|
||||||
|
getComponent();
|
||||||
|
return component.valid(wizardDescriptor);
|
||||||
|
}
|
||||||
|
private final Set<ChangeListener> listeners = new HashSet<ChangeListener>(1); // or can use ChangeSupport in NB 6.0
|
||||||
|
|
||||||
|
public final void addChangeListener(ChangeListener l) {
|
||||||
|
synchronized (listeners) {
|
||||||
|
listeners.add(l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void removeChangeListener(ChangeListener l) {
|
||||||
|
synchronized (listeners) {
|
||||||
|
listeners.remove(l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void fireChangeEvent() {
|
||||||
|
Set<ChangeListener> ls;
|
||||||
|
synchronized (listeners) {
|
||||||
|
ls = new HashSet<ChangeListener>(listeners);
|
||||||
|
}
|
||||||
|
ChangeEvent ev = new ChangeEvent(this);
|
||||||
|
for (ChangeListener l : ls) {
|
||||||
|
l.stateChanged(ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void readSettings(Object settings) {
|
||||||
|
wizardDescriptor = (WizardDescriptor) settings;
|
||||||
|
component.read(wizardDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void storeSettings(Object settings) {
|
||||||
|
WizardDescriptor d = (WizardDescriptor) settings;
|
||||||
|
component.store(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isFinishPanel() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validate() throws WizardValidationException {
|
||||||
|
getComponent();
|
||||||
|
component.validate(wizardDescriptor);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user