diff --git a/sdk/jme3-obfuscate/build.xml b/sdk/jme3-obfuscate/build.xml
new file mode 100644
index 000000000..1114532fa
--- /dev/null
+++ b/sdk/jme3-obfuscate/build.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+ Builds, tests, and runs the project com.jme3.gde.obfuscate.
+
+
diff --git a/sdk/jme3-obfuscate/manifest.mf b/sdk/jme3-obfuscate/manifest.mf
new file mode 100644
index 000000000..dcfd4f871
--- /dev/null
+++ b/sdk/jme3-obfuscate/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.jme3.gde.obfuscate
+OpenIDE-Module-Implementation-Version: 0
+OpenIDE-Module-Layer: com/jme3/gde/obfuscate/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/jme3/gde/obfuscate/Bundle.properties
+
diff --git a/sdk/jme3-obfuscate/nbproject/build-impl.xml b/sdk/jme3-obfuscate/nbproject/build-impl.xml
new file mode 100644
index 000000000..4ce7d4cff
--- /dev/null
+++ b/sdk/jme3-obfuscate/nbproject/build-impl.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ You must set 'suite.dir' to point to your containing module suite
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdk/jme3-obfuscate/nbproject/genfiles.properties b/sdk/jme3-obfuscate/nbproject/genfiles.properties
new file mode 100644
index 000000000..e094c1c1b
--- /dev/null
+++ b/sdk/jme3-obfuscate/nbproject/genfiles.properties
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=db46de11
+build.xml.script.CRC32=69663b9b
+build.xml.stylesheet.CRC32=a56c6a5b@1.42.2
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=db46de11
+nbproject/build-impl.xml.script.CRC32=c9f3ae73
+nbproject/build-impl.xml.stylesheet.CRC32=238281d1@1.42.2
diff --git a/sdk/jme3-obfuscate/nbproject/project.properties b/sdk/jme3-obfuscate/nbproject/project.properties
new file mode 100644
index 000000000..6780df9a4
--- /dev/null
+++ b/sdk/jme3-obfuscate/nbproject/project.properties
@@ -0,0 +1,6 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
+nbm.homepage=http://proguard.sourceforge.net/
+nbm.module.author=Normen Hansen
+nbm.needs.restart=true
+spec.version.base=0.8.0
diff --git a/sdk/jme3-obfuscate/nbproject/project.xml b/sdk/jme3-obfuscate/nbproject/project.xml
new file mode 100644
index 000000000..9e38e99ba
--- /dev/null
+++ b/sdk/jme3-obfuscate/nbproject/project.xml
@@ -0,0 +1,73 @@
+
+
+ org.netbeans.modules.apisupport.project
+
+
+ com.jme3.gde.obfuscate
+
+
+
+ com.jme3.gde.core
+
+
+
+ 1
+ 0.12
+
+
+
+ org.netbeans.modules.project.ant
+
+
+
+ 1
+ 1.40
+
+
+
+ org.netbeans.modules.projectapi
+
+
+
+ 1
+ 1.35
+
+
+
+ org.netbeans.modules.projectuiapi
+
+
+
+ 1
+ 1.50.0.8
+
+
+
+ org.openide.filesystems
+
+
+
+ 7.46
+
+
+
+ org.openide.util
+
+
+
+ 8.14
+
+
+
+ org.openide.util.lookup
+
+
+
+ 8.6
+
+
+
+
+
+
+
diff --git a/sdk/jme3-obfuscate/nbproject/suite.properties b/sdk/jme3-obfuscate/nbproject/suite.properties
new file mode 100644
index 000000000..29d7cc9bd
--- /dev/null
+++ b/sdk/jme3-obfuscate/nbproject/suite.properties
@@ -0,0 +1 @@
+suite.dir=${basedir}/..
diff --git a/sdk/jme3-obfuscate/release/libs/proguard.jar b/sdk/jme3-obfuscate/release/libs/proguard.jar
new file mode 100644
index 000000000..f688284c7
Binary files /dev/null and b/sdk/jme3-obfuscate/release/libs/proguard.jar differ
diff --git a/sdk/jme3-obfuscate/release/libs/retrace.jar b/sdk/jme3-obfuscate/release/libs/retrace.jar
new file mode 100644
index 000000000..0c405bb77
Binary files /dev/null and b/sdk/jme3-obfuscate/release/libs/retrace.jar differ
diff --git a/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/Bundle.properties b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/Bundle.properties
new file mode 100644
index 000000000..9d412a0fe
--- /dev/null
+++ b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/Bundle.properties
@@ -0,0 +1,8 @@
+OpenIDE-Module-Display-Category=jMonkeyPlatform
+OpenIDE-Module-Long-Description=\
+ Support for obfuscating distributions using ProGuard
+OpenIDE-Module-Name=Obfuscation Support
+OpenIDE-Module-Short-Description=Support for obfuscating distributions
+ObfuscateCustomizerPanel.jCheckBox1.text=Obfuscate Build
+ProGuard=ProGuard
+LBL_Category_Obfuscate=Obfuscation
diff --git a/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/ObfuscateCompositeProvider.java b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/ObfuscateCompositeProvider.java
new file mode 100644
index 000000000..7db9f27b1
--- /dev/null
+++ b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/ObfuscateCompositeProvider.java
@@ -0,0 +1,107 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.gde.obfuscate;
+
+import com.jme3.gde.core.j2seproject.ProjectExtensionManager;
+import com.jme3.gde.core.j2seproject.ProjectExtensionProperties;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+import javax.swing.JComponent;
+
+import org.netbeans.api.project.Project;
+import org.netbeans.spi.project.ui.support.ProjectCustomizer;
+
+import org.openide.util.Exceptions;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+
+/**
+ *
+ * @author normenhansen
+ */
+@ProjectCustomizer.CompositeCategoryProvider.Registration(projectType = "org-netbeans-modules-java-j2seproject", category = "Application", position = 510)
+public class ObfuscateCompositeProvider implements ProjectCustomizer.CompositeCategoryProvider {
+
+ private static final String CAT_OBFUSCATION = "Obfuscation"; // NOI18N
+ private static ProjectExtensionProperties jwsProps = null;
+ private String[] keyList = new String[]{
+ "obfuscate"
+ };
+
+ public ObfuscateCompositeProvider() {
+ }
+
+ @Override
+ public ProjectCustomizer.Category createCategory(Lookup context) {
+ return ProjectCustomizer.Category.create(CAT_OBFUSCATION,
+ NbBundle.getMessage(ObfuscateCompositeProvider.class, "LBL_Category_Obfuscate"), null);
+ }
+
+ @Override
+ public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) {
+ jwsProps = new ProjectExtensionProperties(context.lookup(Project.class), keyList);
+ ObfuscateCustomizerPanel panel = new ObfuscateCustomizerPanel(jwsProps);
+ category.setStoreListener(new SavePropsListener(jwsProps, context.lookup(Project.class)));
+ category.setOkButtonListener(panel);
+ return panel;
+ }
+
+ private class SavePropsListener implements ActionListener {
+
+ private String extensionName = "obfuscate";
+ private String extensionVersion = "v0.9";
+ private String[] extensionDependencies = new String[]{"-post-jar", "-obfuscate"};
+ private ProjectExtensionManager manager = new ProjectExtensionManager(extensionName, extensionVersion, extensionDependencies);
+ private ProjectExtensionProperties properties;
+ private Project project;
+
+ public SavePropsListener(ProjectExtensionProperties props, Project project) {
+ this.properties = props;
+ this.project = project;
+ manager.setAntTaskLibrary("pro-guard");
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if ("true".equals(properties.getProperty("obfuscate"))) {
+ manager.loadTargets("nbres:/com/jme3/gde/obfuscate/pro-guard-targets.xml");
+ manager.checkExtension(project);
+ } else {
+ manager.removeExtension(project);
+ }
+ try {
+ properties.store();
+ } catch (IOException ioe) {
+ Exceptions.printStackTrace(ioe);
+ }
+ }
+
+// private 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());
+// writeFile(str, fo);
+// }
+// }
+// } finally {
+// source.close();
+// }
+// }
+//
+// private void writeFile(ZipInputStream str, FileObject fo) throws IOException {
+// OutputStream out = fo.getOutputStream();
+// try {
+// FileUtil.copy(str, out);
+// } finally {
+// out.close();
+// }
+// }
+ }
+}
diff --git a/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/ObfuscateCustomizerPanel.form b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/ObfuscateCustomizerPanel.form
new file mode 100644
index 000000000..23cb97c48
--- /dev/null
+++ b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/ObfuscateCustomizerPanel.form
@@ -0,0 +1,45 @@
+
+
+
diff --git a/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/ObfuscateCustomizerPanel.java b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/ObfuscateCustomizerPanel.java
new file mode 100644
index 000000000..feaba966a
--- /dev/null
+++ b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/ObfuscateCustomizerPanel.java
@@ -0,0 +1,88 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * LwjglAppletCustomizerPanel.java
+ *
+ * Created on 11.11.2010, 16:56:53
+ */
+package com.jme3.gde.obfuscate;
+
+import com.jme3.gde.core.j2seproject.ProjectExtensionProperties;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import org.openide.util.HelpCtx;
+
+/**
+ *
+ * @author normenhansen
+ */
+public class ObfuscateCustomizerPanel extends javax.swing.JPanel implements ActionListener {
+
+ private ProjectExtensionProperties properties;
+
+ /** Creates new form LwjglAppletCustomizerPanel */
+ public ObfuscateCustomizerPanel(ProjectExtensionProperties properties) {
+ this.properties = properties;
+ initComponents();
+ loadProperties();
+ HelpCtx.setHelpIDString(this, "sdk.application_deployment");
+ }
+
+ private void loadProperties() {
+ String str = properties.getProperty("obfuscate");
+ if ("true".equals(str)) {
+ jCheckBox1.setSelected(true);
+ } else {
+ jCheckBox1.setSelected(false);
+ }
+ }
+
+ private void saveProperties() {
+ if (jCheckBox1.isSelected()) {
+ properties.setProperty("obfuscate", "true");
+ } else {
+ properties.setProperty("obfuscate", "");
+ }
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ saveProperties();
+ }
+
+ /** 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.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jCheckBox1 = new javax.swing.JCheckBox();
+
+ jCheckBox1.setText(org.openide.util.NbBundle.getMessage(ObfuscateCustomizerPanel.class, "ObfuscateCustomizerPanel.jCheckBox1.text")); // NOI18N
+
+ 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()
+ .addComponent(jCheckBox1, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(jCheckBox1)
+ .addContainerGap(241, Short.MAX_VALUE))
+ );
+ }// //GEN-END:initComponents
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JCheckBox jCheckBox1;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/layer.xml b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/layer.xml
new file mode 100644
index 000000000..3b540d710
--- /dev/null
+++ b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/layer.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/pro-guard-targets.xml b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/pro-guard-targets.xml
new file mode 100644
index 000000000..e1b9435ba
--- /dev/null
+++ b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/pro-guard-targets.xml
@@ -0,0 +1,36 @@
+
+
+
+ -libraryjars ${proguard.library.path}
+ -injars ${dist.jar}
+ -outjars ${dist.jar}.obfuscated.jar
+ -keepclasseswithmembers public class * {
+ public static void main(java.lang.String[]);
+ }
+ -keep public class * implements de.lessvoid.nifty.screen.ScreenController
+ -keep public class * extends com.jme3.app.Application
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/pro-guard.xml b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/pro-guard.xml
new file mode 100644
index 000000000..d2cbc8d69
--- /dev/null
+++ b/sdk/jme3-obfuscate/src/com/jme3/gde/obfuscate/pro-guard.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ pro-guard
+ j2se
+ com.jme3.gde.obfuscate.Bundle
+
+ classpath
+ jar:nbinst://com.jme3.gde.obfuscate/libs/proguard.jar!/
+ jar:nbinst://com.jme3.gde.obfuscate/libs/retrace.jar!/
+
+
+ src
+
+
+ javadoc
+
+