- Add mother of all SDK features: Custom AppStates :O git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10068 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
parent
a6d62a1d16
commit
7d82eb6ee0
@ -0,0 +1,66 @@ |
||||
<?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"> |
||||
<Component id="jToolBar1" alignment="0" pref="259" max="32767" attributes="0"/> |
||||
<Component id="jScrollPane1" alignment="0" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="1" attributes="0"> |
||||
<Component id="jToolBar1" min="-2" pref="25" max="-2" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="jScrollPane1" pref="193" max="32767" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane1"> |
||||
<AuxValues> |
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new BeanTreeView()"/> |
||||
</AuxValues> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> |
||||
</Container> |
||||
<Container class="javax.swing.JToolBar" name="jToolBar1"> |
||||
<Properties> |
||||
<Property name="floatable" type="boolean" value="false"/> |
||||
<Property name="rollover" type="boolean" value="true"/> |
||||
</Properties> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JButton" name="jButton1"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/core/appstates/Bundle.properties" key="AppStateExplorerTopComponent.jButton1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
<Property name="enabled" type="boolean" value="false"/> |
||||
<Property name="focusable" type="boolean" value="false"/> |
||||
<Property name="horizontalTextPosition" type="int" value="0"/> |
||||
<Property name="verticalTextPosition" type="int" value="3"/> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
</SubComponents> |
||||
</Container> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,200 @@ |
||||
/* |
||||
* Copyright (c) 2003-2012 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.core.appstates; |
||||
|
||||
import com.jme3.asset.AssetManager; |
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import com.jme3.gde.core.scene.PreviewRequest; |
||||
import com.jme3.gde.core.scene.SceneApplication; |
||||
import com.jme3.gde.core.scene.SceneListener; |
||||
import com.jme3.gde.core.scene.SceneRequest; |
||||
import com.jme3.renderer.Camera; |
||||
import com.jme3.scene.Spatial; |
||||
import javax.swing.ActionMap; |
||||
import org.netbeans.api.settings.ConvertAsProperties; |
||||
import org.openide.awt.ActionID; |
||||
import org.openide.awt.ActionReference; |
||||
import org.openide.explorer.ExplorerManager; |
||||
import org.openide.explorer.ExplorerUtils; |
||||
import org.openide.explorer.view.BeanTreeView; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.windows.TopComponent; |
||||
import org.openide.util.NbBundle.Messages; |
||||
|
||||
/** |
||||
* TODO: preliminary implementation 'til new scene system |
||||
*/ |
||||
@ConvertAsProperties( |
||||
dtd = "-//com.jme3.gde.core.appstates//AppStateExplorer//EN", |
||||
autostore = false) |
||||
@TopComponent.Description( |
||||
preferredID = "AppStateExplorerTopComponent", |
||||
//iconBase="SET/PATH/TO/ICON/HERE",
|
||||
persistenceType = TopComponent.PERSISTENCE_NEVER) |
||||
@TopComponent.Registration(mode = "navigator", openAtStartup = true) |
||||
@ActionID(category = "Window", id = "com.jme3.gde.core.appstates.AppStateExplorerTopComponent") |
||||
@ActionReference(path = "Menu/Window" /*, position = 333 */) |
||||
@TopComponent.OpenActionRegistration( |
||||
displayName = "#CTL_AppStateExplorerAction", |
||||
preferredID = "AppStateExplorerTopComponent") |
||||
@Messages({ |
||||
"CTL_AppStateExplorerAction=AppStateExplorer", |
||||
"CTL_AppStateExplorerTopComponent=AppStateExplorer Window", |
||||
"HINT_AppStateExplorerTopComponent=This is a AppStateExplorer window" |
||||
}) |
||||
public final class AppStateExplorerTopComponent extends TopComponent implements ExplorerManager.Provider { |
||||
|
||||
private transient ExplorerManager explorerManager = new ExplorerManager(); |
||||
private FakeApplication fakeApp; |
||||
private ProjectAssetManager mgr; |
||||
private SceneListener listener = new SceneListener() { |
||||
public void sceneOpened(SceneRequest request) { |
||||
Spatial rootNode = request.getRootNode(); |
||||
if (!(rootNode instanceof com.jme3.scene.Node)) { |
||||
return; |
||||
} |
||||
mgr = request.getManager(); |
||||
AssetManager assetManager = request.getManager(); |
||||
Camera cam = SceneApplication.getApplication().getCamera(); |
||||
com.jme3.scene.Node guiNode = SceneApplication.getApplication().getGuiNode(); |
||||
fakeApp = new FakeApplication((com.jme3.scene.Node) rootNode, guiNode, assetManager, cam); |
||||
//TODO: ermagherd, hackish
|
||||
SceneApplication.getApplication().setFakeApp(fakeApp); |
||||
final AppStateManagerNode nod = new AppStateManagerNode(fakeApp.getStateManager()); |
||||
jButton1.setEnabled(true); |
||||
explorerManager.setRootContext(nod); |
||||
setActivatedNodes(new Node[]{nod}); |
||||
} |
||||
|
||||
public void sceneClosed(SceneRequest request) { |
||||
SceneApplication.getApplication().setFakeApp(null); |
||||
mgr = null; |
||||
fakeApp = null; |
||||
jButton1.setEnabled(false); |
||||
explorerManager.setRootContext(Node.EMPTY); |
||||
setActivatedNodes(new Node[]{Node.EMPTY}); |
||||
} |
||||
|
||||
public void previewCreated(PreviewRequest request) { |
||||
} |
||||
}; |
||||
|
||||
public AppStateExplorerTopComponent() { |
||||
initComponents(); |
||||
setName(Bundle.CTL_AppStateExplorerTopComponent()); |
||||
setToolTipText(Bundle.HINT_AppStateExplorerTopComponent()); |
||||
ActionMap map = getActionMap(); |
||||
map.put("delete", ExplorerUtils.actionDelete(explorerManager, true)); |
||||
// map.put("moveup", new MoveUpAction());
|
||||
// map.put("movedown", new MoveDownAction());
|
||||
associateLookup(ExplorerUtils.createLookup(explorerManager, map)); |
||||
SceneApplication.getApplication().addSceneListener(listener); |
||||
} |
||||
|
||||
/** |
||||
* 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() { |
||||
|
||||
jScrollPane1 = new BeanTreeView(); |
||||
jToolBar1 = new javax.swing.JToolBar(); |
||||
jButton1 = new javax.swing.JButton(); |
||||
|
||||
jToolBar1.setFloatable(false); |
||||
jToolBar1.setRollover(true); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(AppStateExplorerTopComponent.class, "AppStateExplorerTopComponent.jButton1.text")); // NOI18N
|
||||
jButton1.setEnabled(false); |
||||
jButton1.setFocusable(false); |
||||
jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); |
||||
jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); |
||||
jButton1.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
jButton1ActionPerformed(evt); |
||||
} |
||||
}); |
||||
jToolBar1.add(jButton1); |
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); |
||||
this.setLayout(layout); |
||||
layout.setHorizontalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 259, Short.MAX_VALUE) |
||||
.addComponent(jScrollPane1) |
||||
); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
||||
.addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 193, Short.MAX_VALUE)) |
||||
); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
|
||||
ProjectAssetManager projectAssetManager = mgr; |
||||
FakeApplication fakeApp = this.fakeApp; |
||||
if (fakeApp != null && mgr != null) { |
||||
new NewAppStateWizardAction(projectAssetManager, fakeApp).showWizard(); |
||||
} |
||||
}//GEN-LAST:event_jButton1ActionPerformed
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton jButton1; |
||||
private javax.swing.JScrollPane jScrollPane1; |
||||
private javax.swing.JToolBar jToolBar1; |
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
@Override |
||||
public void componentOpened() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentClosed() { |
||||
} |
||||
|
||||
void writeProperties(java.util.Properties p) { |
||||
// better to version settings since initial version as advocated at
|
||||
// http://wiki.apidesign.org/wiki/PropertyFiles
|
||||
p.setProperty("version", "1.0"); |
||||
} |
||||
|
||||
void readProperties(java.util.Properties p) { |
||||
String version = p.getProperty("version"); |
||||
} |
||||
|
||||
public ExplorerManager getExplorerManager() { |
||||
return explorerManager; |
||||
} |
||||
} |
@ -0,0 +1,109 @@ |
||||
/* |
||||
* Copyright (c) 2003-2012 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.core.appstates; |
||||
|
||||
import com.jme3.app.state.AppState; |
||||
import com.jme3.gde.core.appstates.FakeApplication.FakeAppStateManager; |
||||
import java.util.LinkedList; |
||||
import java.util.List; |
||||
import org.openide.nodes.AbstractNode; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Node; |
||||
|
||||
/** |
||||
* |
||||
* @author normenhansen |
||||
*/ |
||||
public class AppStateManagerNode extends AbstractNode { |
||||
|
||||
// private static Image smallImage =
|
||||
// ImageUtilities.loadImage("com/jme3/gde/core/filters/icons/eye.gif");
|
||||
|
||||
public AppStateManagerNode(FakeAppStateManager manager) { |
||||
super(new AppStateChildren(manager)); |
||||
setName("Loaded App States"); |
||||
manager.setNode(this); |
||||
} |
||||
|
||||
// @Override
|
||||
// public Image getIcon(int type) {
|
||||
// return smallImage;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Image getOpenedIcon(int type) {
|
||||
// return smallImage;
|
||||
// }
|
||||
|
||||
public void refresh() { |
||||
//TODO: external refresh
|
||||
((AppStateChildren) getChildren()).doRefresh(); |
||||
} |
||||
|
||||
public static class AppStateChildren extends Children.Keys<Object> { |
||||
|
||||
private final FakeAppStateManager manager; |
||||
|
||||
public AppStateChildren(FakeAppStateManager manager) { |
||||
this.manager = manager; |
||||
} |
||||
|
||||
@Override |
||||
protected void addNotify() { |
||||
super.addNotify(); |
||||
setKeys(createKeys()); |
||||
} |
||||
|
||||
protected void doRefresh() { |
||||
addNotify(); |
||||
refresh(); |
||||
} |
||||
|
||||
protected void reorderNotify() { |
||||
setKeys(createKeys()); |
||||
} |
||||
|
||||
protected List<Object> createKeys() { |
||||
List<Object> keys = new LinkedList<Object>(); |
||||
List<AppState> states; |
||||
states = manager.getAddedStates(); |
||||
keys.addAll(states); |
||||
return keys; |
||||
} |
||||
|
||||
@Override |
||||
protected Node[] createNodes(Object t) { |
||||
AppStateNode node = new AppStateNode((AppState) t, manager); |
||||
return new Node[]{node}; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,191 @@ |
||||
/* |
||||
* Copyright (c) 2003-2012 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.core.appstates; |
||||
|
||||
import com.jme3.app.state.AppState; |
||||
import com.jme3.app.state.AppStateManager; |
||||
import com.jme3.gde.core.properties.SceneExplorerProperty; |
||||
import com.jme3.gde.core.properties.ScenePropertyChangeListener; |
||||
import com.jme3.gde.core.util.PropertyUtils; |
||||
import java.beans.PropertyDescriptor; |
||||
import java.io.IOException; |
||||
import java.lang.reflect.Field; |
||||
import java.lang.reflect.Method; |
||||
import org.openide.DialogDisplayer; |
||||
import org.openide.NotifyDescriptor; |
||||
import org.openide.nodes.AbstractNode; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Node.Property; |
||||
import org.openide.nodes.Sheet; |
||||
import org.openide.util.Exceptions; |
||||
|
||||
/** |
||||
* |
||||
* @author normenhansen |
||||
*/ |
||||
public class AppStateNode extends AbstractNode implements ScenePropertyChangeListener { |
||||
|
||||
protected AppState appState; |
||||
protected AppStateManager parent; |
||||
// private static Image icon;
|
||||
// private static final String ICON_ENABLED = "com/jme3/gde/core/filters/icons/eye.gif";
|
||||
// private static final String ICON_DISABLED = "com/jme3/gde/core/filters/icons/crossedEye.gif";
|
||||
|
||||
public AppStateNode(AppState appState, AppStateManager parent) { |
||||
super(Children.LEAF); |
||||
this.parent = parent; |
||||
this.appState = appState; |
||||
setName(appState.getClass().getName()); |
||||
setDisplayName(appState.getClass().getSimpleName()); |
||||
// icon = ImageUtilities.loadImage(ICON_ENABLED);
|
||||
// setIconBaseWithExtension(ICON_ENABLED);
|
||||
} |
||||
|
||||
// @Override
|
||||
// public Image getIcon(int type) {
|
||||
// return icon;
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Image getOpenedIcon(int type) {
|
||||
// return icon;
|
||||
// }
|
||||
//
|
||||
// public void toggleIcon(boolean enabled) {
|
||||
// if (enabled) {
|
||||
// icon = ImageUtilities.loadImage(ICON_ENABLED);
|
||||
//
|
||||
// } else {
|
||||
// icon = ImageUtilities.loadImage(ICON_DISABLED);
|
||||
//
|
||||
// }
|
||||
// fireIconChange();
|
||||
// }
|
||||
// @Override
|
||||
// public Action[] getActions(boolean context) {
|
||||
// return new Action[]{
|
||||
// //Actions.alwaysEnabled(new EnableFiterAction(this), "Toggle enabled", "", false),
|
||||
// // SystemAction.get(MoveUpAction.class),
|
||||
// // SystemAction.get(MoveDownAction.class),
|
||||
// null, // SystemAction.get(DeleteAction.class),
|
||||
// };
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Action getPreferredAction() {
|
||||
//// return Actions.alwaysEnabled(new EnableFiterAction(this), "Toggle enabled", "", false);
|
||||
// return null;
|
||||
// }
|
||||
@Override |
||||
public boolean canDestroy() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void destroy() throws IOException { |
||||
super.destroy(); |
||||
parent.detach(appState); |
||||
//TODO:hack
|
||||
((AppStateManagerNode) getParentNode()).refresh(); |
||||
} |
||||
|
||||
@Override |
||||
protected Sheet createSheet() { |
||||
Sheet sheet = super.createSheet(); |
||||
Object obj = appState; |
||||
if (obj == null) { |
||||
DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message( |
||||
"AppState unexpectedly null", |
||||
NotifyDescriptor.WARNING_MESSAGE)); |
||||
return sheet; |
||||
} |
||||
|
||||
// Sheet.Set set2 = Sheet.createPropertiesSet();
|
||||
// set2.setDisplayName("AppStateMethods");
|
||||
// set2.setName(appState.getClass().getName() + ".hack");
|
||||
// createMethods(appState.getClass(), set2, obj);
|
||||
// sheet.put(set2);
|
||||
|
||||
Sheet.Set set = Sheet.createPropertiesSet(); |
||||
set.setDisplayName("AppState"); |
||||
set.setName(appState.getClass().getName()); |
||||
createFields(appState.getClass(), set, obj); |
||||
sheet.put(set); |
||||
|
||||
return sheet; |
||||
} |
||||
|
||||
protected Property<?> makeProperty(Object obj, Class returntype, String method, String name) { |
||||
Property<?> prop = null; |
||||
try { |
||||
//getExplorerObjectClass().cast(obj)
|
||||
prop = new SceneExplorerProperty(appState.getClass().cast(obj), returntype, method, null, this); |
||||
prop.setName(name); |
||||
} catch (NoSuchMethodException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
return prop; |
||||
} |
||||
|
||||
protected Property<?> makeProperty(Object obj, Class returntype, String method, String setter, String name) { |
||||
Property<?> prop = null; |
||||
try { |
||||
prop = new SceneExplorerProperty(appState.getClass().cast(obj), returntype, method, setter, this); |
||||
prop.setName(name); |
||||
} catch (NoSuchMethodException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
return prop; |
||||
} |
||||
|
||||
protected void createMethods(Class c, Sheet.Set set, Object obj) throws SecurityException { |
||||
for (Method method : c.getDeclaredMethods()) { |
||||
PropertyDescriptor prop = PropertyUtils.getPropertyDescriptor(c, method); |
||||
if (prop != null) { |
||||
set.put(makeProperty(obj, prop.getPropertyType(), prop.getReadMethod().getName(), prop.getWriteMethod().getName(), prop.getDisplayName())); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected void createFields(Class c, Sheet.Set set, Object obj) throws SecurityException { |
||||
for (Field field : c.getDeclaredFields()) { |
||||
PropertyDescriptor prop = PropertyUtils.getPropertyDescriptor(c, field); |
||||
if (prop != null) { |
||||
set.put(makeProperty(obj, prop.getPropertyType(), prop.getReadMethod().getName(), prop.getWriteMethod().getName(), prop.getDisplayName())); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void propertyChange(String property, Object oldValue, Object newValue) { |
||||
} |
||||
} |
@ -0,0 +1,3 @@ |
||||
AppStateExplorerTopComponent.jButton1.text=attach.. |
||||
NewAppStateVisualPanel1.jLabel1.text=Select or enter AppState classname |
||||
NewAppStateVisualPanel1.jTextField1.text=com.mycompany.MyAppState |
@ -0,0 +1,425 @@ |
||||
/* |
||||
* Copyright (c) 2003-2012 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.core.appstates; |
||||
|
||||
import com.jme3.app.Application; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.app.state.AppState; |
||||
import com.jme3.app.state.AppStateManager; |
||||
import com.jme3.asset.AssetManager; |
||||
import com.jme3.audio.AudioRenderer; |
||||
import com.jme3.audio.Listener; |
||||
import com.jme3.input.FlyByCamera; |
||||
import com.jme3.input.InputManager; |
||||
import com.jme3.renderer.Camera; |
||||
import com.jme3.renderer.RenderManager; |
||||
import com.jme3.renderer.Renderer; |
||||
import com.jme3.renderer.ViewPort; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.JmeContext; |
||||
import com.jme3.system.JmeContext.Type; |
||||
import com.jme3.system.Timer; |
||||
import java.io.BufferedOutputStream; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.PrintStream; |
||||
import java.io.UnsupportedEncodingException; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.concurrent.Callable; |
||||
import java.util.concurrent.Future; |
||||
import org.openide.DialogDisplayer; |
||||
import org.openide.NotifyDescriptor; |
||||
import org.openide.util.Exceptions; |
||||
|
||||
/** |
||||
* TODO: Temporary implementation before new scene system! |
||||
* |
||||
* @author normenhansen |
||||
*/ |
||||
public class FakeApplication extends SimpleApplication { |
||||
// private Lookup lookup;
|
||||
|
||||
private Node rootNode; |
||||
private Node guiNode; |
||||
private AssetManager assetManager; |
||||
private Camera cam; |
||||
private FakeAppStateManager appStateManager; |
||||
private FakeRenderManager renderManager; |
||||
|
||||
public FakeApplication(Node rootNode, Node guiNode, AssetManager assetManager, Camera cam) { |
||||
this.rootNode = rootNode; |
||||
this.guiNode = guiNode; |
||||
this.assetManager = assetManager; |
||||
this.cam = cam; |
||||
this.appStateManager = new FakeAppStateManager(this); |
||||
} |
||||
|
||||
@Override |
||||
public void createCanvas() { |
||||
defaultFakeError(true); |
||||
} |
||||
|
||||
@Override |
||||
public void destroy() { |
||||
defaultFakeError(true); |
||||
} |
||||
|
||||
@Override |
||||
protected void destroyInput() { |
||||
defaultFakeError(true); |
||||
} |
||||
|
||||
@Override |
||||
public <V> Future<V> enqueue(Callable<V> callable) { |
||||
return super.enqueue(callable); |
||||
} |
||||
|
||||
@Override |
||||
public void gainFocus() { |
||||
defaultFakeError(true); |
||||
} |
||||
|
||||
@Override |
||||
public AssetManager getAssetManager() { |
||||
return assetManager; |
||||
} |
||||
|
||||
@Override |
||||
public AudioRenderer getAudioRenderer() { |
||||
defaultFakeError(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Camera getCamera() { |
||||
return cam; |
||||
} |
||||
|
||||
@Override |
||||
public JmeContext getContext() { |
||||
defaultFakeError(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ViewPort getGuiViewPort() { |
||||
//TODO
|
||||
defaultFakeError(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public InputManager getInputManager() { |
||||
defaultFakeError(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Listener getListener() { |
||||
defaultFakeError(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public RenderManager getRenderManager() { |
||||
defaultFakeError(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Renderer getRenderer() { |
||||
defaultFakeError(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public FakeAppStateManager getStateManager() { |
||||
return appStateManager; |
||||
} |
||||
|
||||
@Override |
||||
public Timer getTimer() { |
||||
defaultFakeError(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ViewPort getViewPort() { |
||||
//TODO
|
||||
defaultFakeError(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPauseOnLostFocus() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void loseFocus() { |
||||
defaultFakeError(true); |
||||
} |
||||
|
||||
@Override |
||||
public void initialize() { |
||||
defaultFakeError(true); |
||||
} |
||||
|
||||
@Override |
||||
public void handleError(String errMsg, Throwable t) { |
||||
defaultFakeError(true); |
||||
} |
||||
|
||||
@Override |
||||
public void requestClose(boolean esc) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void reshape(int w, int h) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void restart() { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void setAssetManager(AssetManager assetManager) { |
||||
defaultFakeError(true); |
||||
} |
||||
|
||||
@Override |
||||
public void setSettings(AppSettings settings) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void setPauseOnLostFocus(boolean pauseOnLostFocus) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void start() { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void start(Type contextType) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void startCanvas() { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void startCanvas(boolean waitFor) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void stop() { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void stop(boolean waitFor) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void update() { |
||||
defaultFakeError(true); |
||||
} |
||||
|
||||
/* |
||||
* SimpleApplication |
||||
*/ |
||||
@Override |
||||
public void simpleInitApp() { |
||||
defaultFakeError(true); |
||||
} |
||||
|
||||
@Override |
||||
public FlyByCamera getFlyByCamera() { |
||||
defaultFakeError(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Node getGuiNode() { |
||||
return guiNode; |
||||
} |
||||
|
||||
@Override |
||||
public Node getRootNode() { |
||||
return rootNode; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isShowSettings() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void setDisplayFps(boolean show) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void setDisplayStatView(boolean show) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void setTimer(Timer timer) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void setShowSettings(boolean showSettings) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleRender(RenderManager rm) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
defaultFakeError(); |
||||
} |
||||
|
||||
private class FakeRenderManager extends RenderManager { |
||||
|
||||
public FakeRenderManager(Renderer renderer) { |
||||
super(null); |
||||
} |
||||
//TODO: also nice messages
|
||||
} |
||||
|
||||
/* |
||||
* Internal |
||||
*/ |
||||
private void defaultFakeError() { |
||||
defaultFakeError(false); |
||||
} |
||||
|
||||
private void defaultFakeError(boolean severe) { |
||||
ByteArrayOutputStream str = new ByteArrayOutputStream(); |
||||
new Throwable().printStackTrace(new PrintStream(new BufferedOutputStream(str))); |
||||
String trace = "No stack trace available."; |
||||
try { |
||||
trace = str.toString("UTF-8"); |
||||
} catch (UnsupportedEncodingException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
int idx = trace.indexOf("com.jme3.gde"); |
||||
while (idx != -1) { |
||||
if (idx < 50) { |
||||
continue; |
||||
} else { |
||||
trace = trace.substring(0, idx); |
||||
break; |
||||
} |
||||
} |
||||
showError("Fake app is fake!" + (severe ? "And WTF are you trying to do anyway?\n" : "\n") + trace); |
||||
} |
||||
|
||||
private void showError(String msg) { |
||||
DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message( |
||||
msg, |
||||
NotifyDescriptor.WARNING_MESSAGE)); |
||||
} |
||||
|
||||
public void updateFake(float tpf) { |
||||
// System.out.println("UPDATE");
|
||||
appStateManager.update(tpf); |
||||
} |
||||
|
||||
public void renderFake() { |
||||
appStateManager.render(renderManager); |
||||
} |
||||
|
||||
public static class FakeAppStateManager extends AppStateManager { |
||||
|
||||
private AppStateManagerNode node; |
||||
ArrayList<AppState> states = new ArrayList<AppState>(); |
||||
|
||||
public FakeAppStateManager(Application app) { |
||||
super(app); |
||||
} |
||||
|
||||
public List<AppState> getAddedStates() { |
||||
return states; |
||||
} |
||||
|
||||
@Override |
||||
public boolean attach(AppState state) { |
||||
boolean ret = super.attach(state); |
||||
try { |
||||
states.add(state); |
||||
} catch (Exception e) { |
||||
Exceptions.printStackTrace(e); |
||||
} |
||||
// DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message(
|
||||
// "attach state",
|
||||
// NotifyDescriptor.WARNING_MESSAGE));
|
||||
if (node != null) { |
||||
// DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message(
|
||||
// "refresh node",
|
||||
// NotifyDescriptor.WARNING_MESSAGE));
|
||||
node.refresh(); |
||||
} |
||||
return ret; |
||||
} |
||||
|
||||
@Override |
||||
public boolean detach(AppState state) { |
||||
try { |
||||
states.remove(state); |
||||
} catch (Exception e) { |
||||
Exceptions.printStackTrace(e); |
||||
} |
||||
return super.detach(state); |
||||
} |
||||
|
||||
public void setNode(AppStateManagerNode node) { |
||||
this.node = node; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,85 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.5" maxVersion="1.7" 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 max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jScrollPane1" alignment="1" pref="351" max="32767" attributes="0"/> |
||||
<Component id="jTextField1" max="32767" attributes="0"/> |
||||
<Component id="jLabel1" alignment="0" max="32767" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="1" attributes="0"> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="jScrollPane1" pref="172" max="32767" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="jLabel1" min="-2" max="-2" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="jTextField1" min="-2" max="-2" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane1"> |
||||
<AuxValues> |
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/> |
||||
</AuxValues> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JList" name="jList1"> |
||||
<Properties> |
||||
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.editors2.ListModelEditor"> |
||||
<StringArray count="5"> |
||||
<StringItem index="0" value="Item 1"/> |
||||
<StringItem index="1" value="Item 2"/> |
||||
<StringItem index="2" value="Item 3"/> |
||||
<StringItem index="3" value="Item 4"/> |
||||
<StringItem index="4" value="Item 5"/> |
||||
</StringArray> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="valueChanged" listener="javax.swing.event.ListSelectionListener" parameters="javax.swing.event.ListSelectionEvent" handler="updateClassName"/> |
||||
</Events> |
||||
</Component> |
||||
</SubComponents> |
||||
</Container> |
||||
<Component class="javax.swing.JLabel" name="jLabel1"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/core/appstates/Bundle.properties" key="NewAppStateVisualPanel1.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
<Component class="javax.swing.JTextField" name="jTextField1"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/core/appstates/Bundle.properties" key="NewAppStateVisualPanel1.jTextField1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,209 @@ |
||||
/* |
||||
* 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.core.appstates; |
||||
|
||||
import com.jme3.gde.core.sceneexplorer.nodes.actions.impl.*; |
||||
import java.util.HashSet; |
||||
import java.util.Iterator; |
||||
import java.util.LinkedList; |
||||
import java.util.List; |
||||
import java.util.Set; |
||||
import javax.lang.model.element.TypeElement; |
||||
import javax.lang.model.type.TypeMirror; |
||||
import javax.swing.JPanel; |
||||
import org.netbeans.api.java.classpath.ClassPath; |
||||
import org.netbeans.api.java.project.JavaProjectConstants; |
||||
import org.netbeans.api.java.source.ClassIndex; |
||||
import org.netbeans.api.java.source.ClassIndex.NameKind; |
||||
import org.netbeans.api.java.source.ClassIndex.SearchScope; |
||||
import org.netbeans.api.java.source.ClasspathInfo; |
||||
import org.netbeans.api.java.source.CompilationController; |
||||
import org.netbeans.api.java.source.ElementHandle; |
||||
import org.netbeans.api.java.source.JavaSource; |
||||
import org.netbeans.api.java.source.JavaSource.Phase; |
||||
import org.netbeans.api.java.source.Task; |
||||
import org.netbeans.api.project.Project; |
||||
import org.netbeans.api.project.SourceGroup; |
||||
import org.netbeans.api.project.Sources; |
||||
import org.openide.util.Exceptions; |
||||
|
||||
public final class NewAppStateVisualPanel1 extends JPanel { |
||||
|
||||
private Project proj; |
||||
|
||||
/** |
||||
* Creates new form NewCustomControlVisualPanel1 |
||||
*/ |
||||
public NewAppStateVisualPanel1() { |
||||
initComponents(); |
||||
} |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return "Select AppState"; |
||||
} |
||||
|
||||
public String getClassName() { |
||||
return jTextField1.getText(); |
||||
} |
||||
|
||||
private void scanControls() { |
||||
List<String> sources = getSources(); |
||||
jList1.setListData(sources.toArray()); |
||||
} |
||||
|
||||
private List<String> getSources() { |
||||
Sources sources = proj.getLookup().lookup(Sources.class); |
||||
final List<String> list = new LinkedList<String>(); |
||||
if (sources != null) { |
||||
SourceGroup[] groups = sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); |
||||
if (groups != null) { |
||||
for (SourceGroup sourceGroup : groups) { |
||||
ClasspathInfo cpInfo = ClasspathInfo.create(ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.BOOT), |
||||
ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.COMPILE), |
||||
ClassPath.getClassPath(sourceGroup.getRootFolder(), ClassPath.SOURCE)); |
||||
|
||||
HashSet<SearchScope> set = new HashSet<SearchScope>(); |
||||
set.add(ClassIndex.SearchScope.SOURCE); |
||||
Set<ElementHandle<TypeElement>> types = cpInfo.getClassIndex().getDeclaredTypes("", NameKind.PREFIX, set); |
||||
for (Iterator<ElementHandle<TypeElement>> it = types.iterator(); it.hasNext();) { |
||||
final ElementHandle<TypeElement> elementHandle = it.next(); |
||||
JavaSource js = JavaSource.create(cpInfo); |
||||
try { |
||||
js.runUserActionTask(new Task<CompilationController>() { |
||||
public void run(CompilationController control) |
||||
throws Exception { |
||||
control.toPhase(Phase.RESOLVED); |
||||
//TODO: check with proper casting check.. gotta get TypeMirror of Control interface..
|
||||
// TypeUtilities util = control.getTypeUtilities();//.isCastable(Types., null)
|
||||
// util.isCastable(null, null);
|
||||
TypeElement elem = elementHandle.resolve(control); |
||||
if (elem != null) { |
||||
List<? extends TypeMirror> interfaces = elem.getInterfaces(); |
||||
for (TypeMirror typeMirror : interfaces) { |
||||
String interfaceName = typeMirror.toString(); |
||||
if ("com.jme3.app.state.AppState".equals(interfaceName)) { |
||||
list.add(elem.getQualifiedName().toString()); |
||||
} |
||||
} |
||||
TypeMirror superClass = elem.getSuperclass(); |
||||
String superClassName = superClass.toString(); |
||||
if ("com.jme3.app.state.AbstractAppState".equals(superClassName)) { |
||||
list.add(elem.getQualifiedName().toString()); |
||||
} |
||||
} |
||||
} |
||||
}, false); |
||||
} catch (Exception ioe) { |
||||
Exceptions.printStackTrace(ioe); |
||||
} |
||||
} |
||||
|
||||
} |
||||
} |
||||
} |
||||
return list; |
||||
} |
||||
|
||||
public void load(Project proj) { |
||||
this.proj = proj; |
||||
scanControls(); |
||||
} |
||||
|
||||
/** |
||||
* 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() { |
||||
|
||||
jScrollPane1 = new javax.swing.JScrollPane(); |
||||
jList1 = new javax.swing.JList(); |
||||
jLabel1 = new javax.swing.JLabel(); |
||||
jTextField1 = new javax.swing.JTextField(); |
||||
|
||||
jList1.setModel(new javax.swing.AbstractListModel() { |
||||
String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; |
||||
public int getSize() { return strings.length; } |
||||
public Object getElementAt(int i) { return strings[i]; } |
||||
}); |
||||
jList1.addListSelectionListener(new javax.swing.event.ListSelectionListener() { |
||||
public void valueChanged(javax.swing.event.ListSelectionEvent evt) { |
||||
updateClassName(evt); |
||||
} |
||||
}); |
||||
jScrollPane1.setViewportView(jList1); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(NewAppStateVisualPanel1.class, "NewAppStateVisualPanel1.jLabel1.text")); // NOI18N
|
||||
|
||||
jTextField1.setText(org.openide.util.NbBundle.getMessage(NewAppStateVisualPanel1.class, "NewAppStateVisualPanel1.jTextField1.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() |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 351, Short.MAX_VALUE) |
||||
.addComponent(jTextField1) |
||||
.addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) |
||||
.addContainerGap()) |
||||
); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
||||
.addContainerGap() |
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 172, Short.MAX_VALUE) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addComponent(jLabel1) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addContainerGap()) |
||||
); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void updateClassName(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_updateClassName
|
||||
Object obj = jList1.getSelectedValue(); |
||||
if (obj != null) { |
||||
jTextField1.setText(obj + ""); |
||||
} |
||||
}//GEN-LAST:event_updateClassName
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JLabel jLabel1; |
||||
private javax.swing.JList jList1; |
||||
private javax.swing.JScrollPane jScrollPane1; |
||||
private javax.swing.JTextField jTextField1; |
||||
// End of variables declaration//GEN-END:variables
|
||||
} |
@ -0,0 +1,168 @@ |
||||
/* |
||||
* 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.core.appstates; |
||||
|
||||
import com.jme3.app.Application; |
||||
import com.jme3.app.state.AbstractAppState; |
||||
import com.jme3.app.state.AppState; |
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import java.awt.Component; |
||||
import java.awt.Dialog; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.text.MessageFormat; |
||||
import java.util.List; |
||||
import javax.swing.JComponent; |
||||
import org.openide.DialogDisplayer; |
||||
import org.openide.NotifyDescriptor; |
||||
import org.openide.WizardDescriptor; |
||||
import org.openide.util.Exceptions; |
||||
|
||||
// An example action demonstrating how the wizard could be called from within
|
||||
// your code. You can move the code below wherever you need, or register an action:
|
||||
// @ActionID(category="...", id="com.jme3.gde.core.sceneexplorer.nodes.actions.impl.NewCustomControlWizardAction")
|
||||
// @ActionRegistration(displayName="Open NewCustomControl Wizard")
|
||||
// @ActionReference(path="Menu/Tools", position=...)
|
||||
public final class NewAppStateWizardAction implements ActionListener { |
||||
|
||||
private WizardDescriptor.Panel[] panels; |
||||
ProjectAssetManager mgr; |
||||
Application fakeApp; |
||||
|
||||
public NewAppStateWizardAction(ProjectAssetManager mgr, Application fakeApp) { |
||||
this.mgr = mgr; |
||||
this.fakeApp = fakeApp; |
||||
} |
||||
|
||||
public void actionPerformed(ActionEvent e) { |
||||
//TODO: actual action to open/close via keyboard etc?
|
||||
} |
||||
|
||||
protected void showWizard() { |
||||
WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels()); |
||||
// {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
|
||||
wizardDescriptor.setTitleFormat(new MessageFormat("{0}")); |
||||
wizardDescriptor.setTitle("Add New AppState"); |
||||
wizardDescriptor.putProperty("asset_manager", mgr); |
||||
wizardDescriptor.putProperty("fake_app", fakeApp); |
||||
wizardDescriptor.putProperty("project", mgr.getProject()); |
||||
Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor); |
||||
dialog.setVisible(true); |
||||
dialog.toFront(); |
||||
boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION; |
||||
if (!cancelled) { |
||||
AppState state = doCreateAppState(wizardDescriptor); |
||||
if (state != null) { |
||||
fakeApp.getStateManager().attach(state); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected AppState doCreateAppState(WizardDescriptor configuration) { |
||||
if (configuration == null) { |
||||
return null; |
||||
} |
||||
WizardDescriptor wizardDescriptor = (WizardDescriptor) configuration; |
||||
ProjectAssetManager manager = (ProjectAssetManager) wizardDescriptor.getProperty("asset_manager"); |
||||
List<ClassLoader> loaders = manager.getClassLoaders(); |
||||
|
||||
String className = (String) wizardDescriptor.getProperty("class_name"); |
||||
Class clazz = null; |
||||
try { |
||||
clazz = getClass().getClassLoader().loadClass(className); |
||||
} catch (ClassNotFoundException ex) { |
||||
} |
||||
for (ClassLoader classLoader : loaders) { |
||||
if (clazz == null) { |
||||
try { |
||||
clazz = classLoader.loadClass(className); |
||||
} catch (ClassNotFoundException ex) { |
||||
} |
||||
} |
||||
} |
||||
if (clazz != null) { |
||||
try { |
||||
Object contr = clazz.newInstance(); |
||||
//TODO: remove sillyness-test
|
||||
if (contr instanceof AppState || contr instanceof AbstractAppState) { |
||||
return (AppState) contr; |
||||
} else { |
||||
DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message("This is no AppState class!")); |
||||
} |
||||
} catch (InstantiationException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message("Error instatiating class!")); |
||||
} catch (IllegalAccessException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message("Error instatiating class!")); |
||||
} |
||||
} else { |
||||
DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message("Cannot find class: " + className + "\nMake sure the name is correct and the project is compiled,\nbest enable 'Save on Compile' in the project preferences.")); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* Initialize panels representing individual wizard's steps and sets various |
||||
* properties for them influencing wizard appearance. |
||||
*/ |
||||
private WizardDescriptor.Panel[] getPanels() { |
||||
if (panels == null) { |
||||
panels = new WizardDescriptor.Panel[]{ |
||||
new NewAppStateWizardPanel1() |
||||
}; |
||||
String[] steps = new String[panels.length]; |
||||
for (int i = 0; i < panels.length; i++) { |
||||
Component c = panels[i].getComponent(); |
||||
// 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; |
||||
// Sets step number of a component
|
||||
// TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*:
|
||||
jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i)); |
||||
// Sets steps names for a panel
|
||||
jc.putClientProperty("WizardPanel_contentData", steps); |
||||
// Turn on subtitle creation on each step
|
||||
jc.putClientProperty("WizardPanel_autoWizardStyle", Boolean.TRUE); |
||||
// Show steps on the left side with the image on the background
|
||||
jc.putClientProperty("WizardPanel_contentDisplayed", Boolean.TRUE); |
||||
// Turn on numbering of all steps
|
||||
jc.putClientProperty("WizardPanel_contentNumbered", Boolean.TRUE); |
||||
} |
||||
} |
||||
} |
||||
return panels; |
||||
} |
||||
} |
@ -0,0 +1,117 @@ |
||||
/* |
||||
* 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.core.appstates; |
||||
|
||||
import com.jme3.gde.core.sceneexplorer.nodes.actions.impl.*; |
||||
import java.awt.Component; |
||||
import javax.swing.event.ChangeListener; |
||||
import org.netbeans.api.project.Project; |
||||
import org.openide.WizardDescriptor; |
||||
import org.openide.util.HelpCtx; |
||||
|
||||
public class NewAppStateWizardPanel1 implements WizardDescriptor.Panel { |
||||
|
||||
/** |
||||
* The visual component that displays this panel. If you need to access the |
||||
* component from this class, just use getComponent(). |
||||
*/ |
||||
private Component component; |
||||
|
||||
// Get the visual component for the panel. In this template, the component
|
||||
// is kept separate. This can be more efficient: if the wizard is created
|
||||
// but never displayed, or not all panels are displayed, it is better to
|
||||
// create only those which really need to be visible.
|
||||
public Component getComponent() { |
||||
if (component == null) { |
||||
component = new NewAppStateVisualPanel1(); |
||||
} |
||||
return component; |
||||
} |
||||
|
||||
public HelpCtx getHelp() { |
||||
// Show no Help button for this panel:
|
||||
return HelpCtx.DEFAULT_HELP; |
||||
// If you have context help:
|
||||
// return new HelpCtx(SampleWizardPanel1.class);
|
||||
} |
||||
|
||||
public boolean isValid() { |
||||
// If it is always OK to press Next or Finish, then:
|
||||
return true; |
||||
// If it depends on some condition (form filled out...), then:
|
||||
// return someCondition();
|
||||
// and when this condition changes (last form field filled in...) then:
|
||||
// fireChangeEvent();
|
||||
// and uncomment the complicated stuff below.
|
||||
} |
||||
|
||||
public final void addChangeListener(ChangeListener l) { |
||||
} |
||||
|
||||
public final void removeChangeListener(ChangeListener l) { |
||||
} |
||||
/* |
||||
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() { |
||||
Iterator<ChangeListener> it; |
||||
synchronized (listeners) { |
||||
it = new HashSet<ChangeListener>(listeners).iterator(); |
||||
} |
||||
ChangeEvent ev = new ChangeEvent(this); |
||||
while (it.hasNext()) { |
||||
it.next().stateChanged(ev); |
||||
} |
||||
} |
||||
*/ |
||||
|
||||
// You can use a settings object to keep track of state. Normally the
|
||||
// settings object will be the WizardDescriptor, so you can use
|
||||
// WizardDescriptor.getProperty & putProperty to store information entered
|
||||
// by the user.
|
||||
public void readSettings(Object settings) { |
||||
((NewAppStateVisualPanel1) component).load((Project)((WizardDescriptor) settings).getProperty("project")); |
||||
} |
||||
|
||||
public void storeSettings(Object settings) { |
||||
((WizardDescriptor) settings).putProperty("class_name", ((NewAppStateVisualPanel1) component).getClassName()); |
||||
} |
||||
} |
Loading…
Reference in new issue