git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10387 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
343f9fd08e
commit
d3426d8f5e
After Width: | Height: | Size: 85 B |
@ -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…
Reference in new issue