From 74c14377e2826caac9f26f701aae38876d12c052 Mon Sep 17 00:00:00 2001 From: relu91 Date: Wed, 20 Aug 2014 14:09:35 +0200 Subject: [PATCH] Code cleaning I cleaned a bit the code creating some other packages and deleting old unused classes --- .../release/modules/ext/Nifty-Editor0.5.9.jar | Bin 6855071 -> 6855158 bytes .../src/com/jme3/gde/gui/Navigator.form | 28 -- .../com/jme3/gde/gui/NiftyGuiDataObject.java | 6 +- .../src/com/jme3/gde/gui/NiftyGuiResolver.xml | 4 - .../jme3/gde/gui/NiftyGuiVisualElement.form | 29 -- .../jme3/gde/gui/OldNiftyGuiDataObject.java | 89 ---- .../jme3/gde/gui/multiview/Bundle.properties | 4 - .../jme3/gde/gui/multiview/ErrorPanel.form | 62 --- .../jme3/gde/gui/multiview/ErrorPanel.java | 114 ----- .../gde/gui/multiview/MouseInputEvent.java | 27 -- .../gde/gui/multiview/NiftyFileChildren.java | 55 --- .../jme3/gde/gui/multiview/NiftyFileNode.java | 22 - .../gde/gui/multiview/NiftyJmeDisplay.java | 167 -------- .../multiview/NiftyPreviewInputHandler.java | 53 --- .../gde/gui/multiview/NiftyPreviewPanel.java | 335 --------------- .../gde/gui/multiview/NiftyScreenNode.java | 22 - .../gui/multiview/PreviewToolbarElement.java | 48 --- .../jme3/gde/gui/multiview/PreviewView.java | 35 -- .../com/jme3/gde/gui/multiview/XmlHelper.java | 73 ---- .../gui/multiview/icons/Computer_File_043.gif | Bin 0 -> 386 bytes .../src/com/jme3/gde/gui/package-info.java | 4 +- .../gde/gui/palette/JmePaletteUtilities.java | 88 ---- .../src/com/jme3/gde/gui/palette/Screen.java | 63 --- .../src/com/jme3/gde/gui/palette/Screen.xml | 16 - .../jme3/gde/gui/templates/EmptyNiftyGui.xml | 10 + .../com/jme3/gde/gui/templates/NiftyGui.xml | 19 + .../src/com/jme3/gde/gui/view/Navigator.java | 200 +++++++++ .../gde/gui/view/NiftyGuiVisualElement.java | 404 ++++++++++++++++++ 28 files changed, 638 insertions(+), 1339 deletions(-) delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/Navigator.form delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiVisualElement.form delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/OldNiftyGuiDataObject.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/Bundle.properties delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/ErrorPanel.form delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/ErrorPanel.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/MouseInputEvent.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyFileChildren.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyFileNode.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyJmeDisplay.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyPreviewInputHandler.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyPreviewPanel.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyScreenNode.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/PreviewToolbarElement.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/PreviewView.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/XmlHelper.java create mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/multiview/icons/Computer_File_043.gif delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/palette/JmePaletteUtilities.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/palette/Screen.java delete mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/palette/Screen.xml create mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/templates/EmptyNiftyGui.xml create mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/templates/NiftyGui.xml create mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/view/Navigator.java create mode 100644 sdk/jme3-gui/src/com/jme3/gde/gui/view/NiftyGuiVisualElement.java diff --git a/sdk/jme3-gui/release/modules/ext/Nifty-Editor0.5.9.jar b/sdk/jme3-gui/release/modules/ext/Nifty-Editor0.5.9.jar index 36800860447b491f00d488234561c292677b25d5..5f71667462d19cbafc2a314ddaba4d95d83125ae 100644 GIT binary patch delta 37689 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 delta 37324 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
^=Bd?7o)8B2l1cRXtE! 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 WB7G*@+e;UgNbW}WPipa1&;J9ijM!5E diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/Navigator.form b/sdk/jme3-gui/src/com/jme3/gde/gui/Navigator.form deleted file mode 100644 index b3657640a..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/Navigator.form +++ /dev/null @@ -1,28 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiDataObject.java b/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiDataObject.java index 35c97ba72..1c5bc7446 100644 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiDataObject.java +++ b/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiDataObject.java @@ -36,7 +36,7 @@ import org.openide.windows.TopComponent; resource = "NiftyGuiResolver.xml") @DataObject.Registration( mimeType = "text/x-niftygui+xml", - iconBase = "com/jme3/gde/gui/Computer_File_043.gif", + iconBase = "com/jme3/gde/gui/multiview/icons/Computer_File_043.gif", displayName = "#LBL_NiftyGui_LOADER", position = 300) @ActionReferences({ @@ -125,7 +125,7 @@ public class NiftyGuiDataObject extends MultiDataObject { @Override protected Node createNodeDelegate() { DataNode node = new DataNode(this, Children.LEAF, getLookup()); - node.setIconBaseWithExtension("com/jme3/gde/gui/Computer_File_043.gif"); + node.setIconBaseWithExtension("com/jme3/gde/gui/multiview/icons/Computer_File_043.gif"); return node; } @@ -136,7 +136,7 @@ public class NiftyGuiDataObject extends MultiDataObject { @MultiViewElement.Registration( displayName = "#LBL_NiftyGui_EDITOR", - iconBase = "com/jme3/gde/gui/Computer_File_043.gif", + iconBase = "com/jme3/gde/gui/multiview/icons/Computer_File_043.gif", mimeType = "text/x-niftygui+xml", persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, preferredID = "NiftyGui", diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiResolver.xml b/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiResolver.xml index cab60462a..4076cc28c 100644 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiResolver.xml +++ b/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiResolver.xml @@ -1,8 +1,4 @@ - diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiVisualElement.form b/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiVisualElement.form deleted file mode 100644 index add7a2637..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/NiftyGuiVisualElement.form +++ /dev/null @@ -1,29 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/OldNiftyGuiDataObject.java b/sdk/jme3-gui/src/com/jme3/gde/gui/OldNiftyGuiDataObject.java deleted file mode 100644 index 7b06694e9..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/OldNiftyGuiDataObject.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.gde.gui; - -import com.jme3.gde.core.assets.ProjectAssetManager; -import com.jme3.gde.gui.multiview.PreviewView; -import java.io.IOException; -import org.netbeans.api.project.Project; -import org.netbeans.api.project.ProjectManager; -import org.netbeans.modules.xml.multiview.DesignMultiViewDesc; -import org.netbeans.modules.xml.multiview.XmlMultiViewDataObject; -import org.openide.filesystems.FileObject; -import org.openide.loaders.DataNode; -import org.openide.loaders.DataObjectExistsException; -import org.openide.loaders.MultiFileLoader; -import org.openide.nodes.Node; -import org.openide.nodes.Children; -import org.openide.util.Lookup; -import org.openide.util.lookup.AbstractLookup; -import org.openide.util.lookup.InstanceContent; -import org.openide.util.lookup.ProxyLookup; - -public class OldNiftyGuiDataObject extends XmlMultiViewDataObject { - - private static final int TYPE_TOOLBAR = 0; - protected final Lookup lookup; - protected final InstanceContent lookupContents = new InstanceContent(); - - public OldNiftyGuiDataObject(FileObject pf, MultiFileLoader loader) throws DataObjectExistsException, IOException { - super(pf, loader); - lookup = new ProxyLookup(getCookieSet().getLookup(), new AbstractLookup(getLookupContents())); - findAssetManager(); - } - - protected void findAssetManager() { - FileObject file = getPrimaryFile(); - ProjectManager pm = ProjectManager.getDefault(); - while (file != null) { - if (file.isFolder() && pm.isProject(file)) { - try { - Project project = ProjectManager.getDefault().findProject(file); - if (project != null) { - ProjectAssetManager mgr = project.getLookup().lookup(ProjectAssetManager.class); - if (mgr != null) { - getLookupContents().add(mgr); - return; - } - } - } catch (IOException ex) { - } catch (IllegalArgumentException ex) { - } - } - file = file.getParent(); - } - } - - @Override - public Lookup getLookup() { - return lookup; - } - - public InstanceContent getLookupContents() { - return lookupContents; - } - - @Override - protected Node createNodeDelegate() { - DataNode node = new DataNode(this, Children.LEAF, getLookup()); - node.setIconBaseWithExtension("com/jme3/gde/gui/Computer_File_043.gif"); - return node; - } - - @Override - protected DesignMultiViewDesc[] getMultiViewDesc() { - if (getLookup().lookup(ProjectAssetManager.class) == null) { - return new DesignMultiViewDesc[]{}; - } else { - - return new DesignMultiViewDesc[]{new PreviewView(this, TYPE_TOOLBAR)}; - } - } - - @Override - protected String getPrefixMark() { - return "Nifty"; - } -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/Bundle.properties b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/Bundle.properties deleted file mode 100644 index 7a6ba8e9c..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/Bundle.properties +++ /dev/null @@ -1,4 +0,0 @@ - -PreviewPanel.jLabel1.text=jLabel1 -ErrorPanel.jLabel1.text=jLabel1 -ErrorPanel.jLabel2.text=\ Errors diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/ErrorPanel.form b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/ErrorPanel.form deleted file mode 100644 index ae4ae89ae..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/ErrorPanel.form +++ /dev/null @@ -1,62 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/ErrorPanel.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/ErrorPanel.java deleted file mode 100644 index 94a62d5a4..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/ErrorPanel.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -/* - * ErrorPanel.java - * - * Created on 23 janv. 2012, 22:19:24 - */ -package com.jme3.gde.gui.multiview; - -import java.awt.Component; -import javax.swing.DefaultListCellRenderer; -import javax.swing.DefaultListModel; -import javax.swing.ImageIcon; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.SwingConstants; - -/** - * - * @author Nehon - */ -public class ErrorPanel extends java.awt.Panel { - - private DefaultListModel errors = new DefaultListModel(); - private static ImageIcon fatalImage = null, nonFatalImage = null; - - /** Creates new form ErrorPanel */ - public ErrorPanel() { - initComponents(); - jList1.setCellRenderer(new DefaultListCellRenderer() { - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof JLabel) { - setIcon(((JLabel) value).getIcon()); - setText(((JLabel) value).getText()); - } - return this; - } - }); - } - - private static ImageIcon getFatalErrorIcon() { - if (fatalImage == null) { - fatalImage = new ImageIcon(ErrorPanel.class.getResource("/com/jme3/gde/gui/multiview/icons/error.png")); //NOI18N - } - return fatalImage; - } - - private static ImageIcon getNonfatalErrorIcon() { - if (nonFatalImage == null) { - nonFatalImage = new ImageIcon(ErrorPanel.class.getResource("/com/jme3/gde/gui/multiview/icons/warning.png")); //NOI18N - } - return nonFatalImage; - } - - public void addError(String error) { - errors.addElement(new JLabel( - error, - getFatalErrorIcon(), - SwingConstants.LEFT)); - - } - - public void addWarning(String error) { - errors.addElement(new JLabel( - error, - getNonfatalErrorIcon(), - SwingConstants.LEFT)); - - } - - public void clear(){ - errors.clear(); - } - - - /** 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. - */ - // //GEN-BEGIN:initComponents - private void initComponents() { - - jLabel1 = new javax.swing.JLabel(); - jScrollPane1 = new javax.swing.JScrollPane(); - jList1 = new javax.swing.JList(); - jLabel2 = new javax.swing.JLabel(); - - jLabel1.setText(org.openide.util.NbBundle.getMessage(ErrorPanel.class, "ErrorPanel.jLabel1.text")); // NOI18N - - setLayout(new java.awt.BorderLayout()); - - jList1.setModel(errors); - jScrollPane1.setViewportView(jList1); - - add(jScrollPane1, java.awt.BorderLayout.CENTER); - - jLabel2.setBackground(new java.awt.Color(200, 200, 200)); - jLabel2.setText(org.openide.util.NbBundle.getMessage(ErrorPanel.class, "ErrorPanel.jLabel2.text")); // NOI18N - add(jLabel2, java.awt.BorderLayout.NORTH); - }// //GEN-END:initComponents - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel2; - private javax.swing.JList jList1; - private javax.swing.JScrollPane jScrollPane1; - // End of variables declaration//GEN-END:variables -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/MouseInputEvent.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/MouseInputEvent.java deleted file mode 100644 index 71a37d433..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/MouseInputEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package com.jme3.gde.gui.multiview; - -/** - * - * @author normenhansen - */ -public class MouseInputEvent { - int x; - int y; - int button; - int huh; - boolean pressed; - - public MouseInputEvent(int x, int y, int button, int huh, boolean pressed) { - this.x = x; - this.y = y; - this.button = button; - this.huh = huh; - this.pressed = pressed; - } - -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyFileChildren.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyFileChildren.java deleted file mode 100644 index ee70aa1d8..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyFileChildren.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.gde.gui.multiview; - -import java.util.LinkedList; -import java.util.List; -import org.openide.nodes.Children; -import org.openide.nodes.Node; -import org.w3c.dom.Element; - -/** - * - * @author normenhansen - */ -public class NiftyFileChildren extends Children.Keys { - - Element xmlNode; - - public NiftyFileChildren(Element xmlNode) { - this.xmlNode = xmlNode; - } - - @Override - protected void addNotify() { - super.addNotify(); - setKeys(createKeys()); - } - - protected List createKeys() { - LinkedList ret = new LinkedList(); - Element curElement = XmlHelper.findFirstChildElement(xmlNode); - while (curElement != null) { - if (checkElement(curElement)) { - ret.add(curElement); - } - curElement = XmlHelper.findNextSiblingElement(curElement); - } - - return ret; - } - - private boolean checkElement(Element curElement) { - if (!"screen".equals(curElement.getTagName())) { - return false; - } - return true; - } - - @Override - protected Node[] createNodes(Element key) { - return new Node[]{new NiftyScreenNode(key.getAttribute("id"))}; - } -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyFileNode.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyFileNode.java deleted file mode 100644 index a3d15f188..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyFileNode.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package com.jme3.gde.gui.multiview; - -import org.openide.nodes.AbstractNode; -import org.w3c.dom.Element; - -/** - * - * @author normenhansen - */ -public class NiftyFileNode extends AbstractNode{ - - public NiftyFileNode(Element xmlNode) { - super(new NiftyFileChildren(xmlNode)); - } - - -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyJmeDisplay.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyJmeDisplay.java deleted file mode 100644 index a76eec721..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyJmeDisplay.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * 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.gui.multiview; - -import com.jme3.asset.AssetInfo; -import com.jme3.asset.AssetKey; -import com.jme3.asset.AssetManager; -import com.jme3.asset.AssetNotFoundException; -import com.jme3.asset.DesktopAssetManager; -import com.jme3.audio.AudioRenderer; -import com.jme3.niftygui.RenderDeviceJme; -import com.jme3.niftygui.SoundDeviceJme; -import com.jme3.post.SceneProcessor; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.Renderer; -import com.jme3.renderer.ViewPort; -import com.jme3.renderer.queue.RenderQueue; -import com.jme3.texture.FrameBuffer; -import de.lessvoid.nifty.Nifty; -import de.lessvoid.nifty.spi.input.InputSystem; -import de.lessvoid.nifty.tools.TimeProvider; -import de.lessvoid.nifty.tools.resourceloader.ResourceLocation; -import java.io.InputStream; -import java.net.URL; - -public class NiftyJmeDisplay extends com.jme3.niftygui.NiftyJmeDisplay implements SceneProcessor { - - protected class ResourceLocationJmp implements ResourceLocation { - - public InputStream getResourceAsStream(String path) { - AssetKey key = new AssetKey(path); - AssetInfo info = assetManager.locateAsset(key); - if (info != null){ - return info.openStream(); - }else{ - throw new AssetNotFoundException(path); - } - } - - public URL getResource(String path) { - throw new UnsupportedOperationException(); - } - } - - private ResourceLocation resourceLocation = new ResourceLocationJmp(); - - public NiftyJmeDisplay(AssetManager assetManager, - InputSystem inputManager, - AudioRenderer audioRenderer, - ViewPort vp){ - this.assetManager = assetManager; - //TODO: move - ((DesktopAssetManager)assetManager).clearCache(); - w = vp.getCamera().getWidth(); - h = vp.getCamera().getHeight(); - - soundDev = new SoundDeviceJme(assetManager, audioRenderer); - renderDev = new RenderDeviceJme(this); - nifty = new Nifty(renderDev, soundDev, inputManager, new TimeProvider()); - nifty.getResourceLoader().addResourceLocation(resourceLocation); - } - - @Override - public void initialize(RenderManager rm, ViewPort vp) { - this.renderManager = rm; - renderDev.setRenderManager(rm); - inited = true; - this.vp = vp; - this.renderer = rm.getRenderer(); - - } - - @Override - public Nifty getNifty() { - return nifty; - } - - RenderDeviceJme getRenderDevice() { - return renderDev; - } - - AssetManager getAssetManager() { - return assetManager; - } - - RenderManager getRenderManager() { - return renderManager; - } - - int getHeight() { - return h; - } - - int getWidth() { - return w; - } - - Renderer getRenderer(){ - return renderer; - } - - @Override - public void reshape(ViewPort vp, int w, int h) { - this.w = w; - this.h = h; - nifty.resolutionChanged(); - } - - @Override - public boolean isInitialized() { - return inited; - } - - @Override - public void preFrame(float tpf) { - } - - @Override - public void postQueue(RenderQueue rq) { - // render nifty before anything else - renderManager.setCamera(vp.getCamera(), true); - nifty.render(false); - renderManager.setCamera(vp.getCamera(), false); - } - - @Override - public void postFrame(FrameBuffer out) { - } - - @Override - public void cleanup() { - nifty.getResourceLoader().removeResourceLocation(resourceLocation); - inited = false; -// nifty.exit(); - } - -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyPreviewInputHandler.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyPreviewInputHandler.java deleted file mode 100644 index a0174a23f..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyPreviewInputHandler.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.gde.gui.multiview; - -import de.lessvoid.nifty.NiftyInputConsumer; -import de.lessvoid.nifty.input.keyboard.KeyboardInputEvent; -import de.lessvoid.nifty.tools.resourceloader.NiftyResourceLoader; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -/** - * - * @author normenhansen - */ -public class NiftyPreviewInputHandler implements de.lessvoid.nifty.spi.input.InputSystem { - - private List mouseEvents = new LinkedList(); - private List keyEvents = new LinkedList(); - - public synchronized void forwardEvents(NiftyInputConsumer nic) { - for (Iterator it = mouseEvents.iterator(); it.hasNext();) { - MouseInputEvent mouseInputEvent = it.next(); - nic.processMouseEvent(mouseInputEvent.x, mouseInputEvent.y, mouseInputEvent.button, mouseInputEvent.huh, mouseInputEvent.pressed); - it.remove(); - } - for (Iterator it = keyEvents.iterator(); it.hasNext();) { - KeyboardInputEvent keyInputEvent = it.next(); - nic.processKeyboardEvent(keyInputEvent); - it.remove(); - } - } - - public synchronized void addMouseEvent(int newMouseX, int newMouseY, boolean mouseDown) { - MouseInputEvent event = new MouseInputEvent(newMouseX, newMouseY, 0, 0, mouseDown); - mouseEvents.add(event); - } - - public synchronized void addKeyEvent(int newKey, char newCharacter, boolean newKeyDown, boolean newShiftDown, boolean newControlDown) { - KeyboardInputEvent event = new KeyboardInputEvent(newKey, newCharacter, newKeyDown, newShiftDown, newControlDown); - keyEvents.add(event); - } - - public void setMousePosition(int i, int i1) { -// throw new UnsupportedOperationException("Not supported yet."); - } - - public void setResourceLoader(NiftyResourceLoader nrl) { - } - -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyPreviewPanel.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyPreviewPanel.java deleted file mode 100644 index 5f887b400..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyPreviewPanel.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.gde.gui.multiview; - -import com.jme3.audio.AudioRenderer; -import com.jme3.gde.core.assets.ProjectAssetManager; -import com.jme3.gde.core.scene.OffScenePanel; -import com.jme3.gde.core.scene.SceneApplication; -import com.jme3.gde.gui.OldNiftyGuiDataObject; -import com.jme3.renderer.ViewPort; -import de.lessvoid.nifty.Nifty; -import java.awt.Dimension; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.io.IOException; -import java.io.InputStream; -import java.util.Collection; -import java.util.Iterator; -import java.util.concurrent.Callable; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.JComboBox; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JToolBar; -import org.netbeans.modules.xml.multiview.Error; -import org.netbeans.modules.xml.multiview.ui.PanelView; -import org.netbeans.modules.xml.multiview.ui.ToolBarDesignEditor; -import org.openide.NotifyDescriptor; -import org.openide.NotifyDescriptor.Message; -import org.openide.nodes.Node; -import org.openide.util.Exceptions; -import org.openide.xml.XMLUtil; -import org.w3c.dom.Document; -import org.xml.sax.ErrorHandler; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; - -/** - * - * @author normenhansen - */ -public class NiftyPreviewPanel extends PanelView implements ErrorHandler { - - private OldNiftyGuiDataObject niftyObject; - private OffScenePanel offPanel; - private Nifty nifty; - private Document doc; - private ToolBarDesignEditor comp; - private String screen = ""; - private NiftyPreviewInputHandler inputHandler; - private NiftyJmeDisplay niftyDisplay; - private JScrollPane scrollPanel; - private int width = 640, height = 480; - private ErrorPanel errors; - - public NiftyPreviewPanel(OldNiftyGuiDataObject niftyObject, ToolBarDesignEditor comp) { - super(); - setRoot(Node.EMPTY); - this.niftyObject = niftyObject; - this.comp = comp; - comp.setContentView(this); - preparePreview(); - updatePreView(); - } - - private void createToolbar() { - JToolBar toolBar = new JToolBar(); - toolBar.setPreferredSize(new Dimension(10000, 24)); - toolBar.setMaximumSize(new Dimension(10000, 24)); - toolBar.setFloatable(false); - JComboBox comboBox = new JComboBox(new String[]{"640x480", "480x800", "800x480", "800x600", "1024x768", "1280x720"}); - comboBox.addItemListener(new ItemListener() { - - public void itemStateChanged(ItemEvent e) { - String string = (String) e.getItem(); - if ("640x480".equals(string)) { - width = 640; - height = 480; - } else if ("1024x768".equals(string)) { - width = 1024; - height = 768; - } else if ("1280x720".equals(string)) { - width = 1280; - height = 720; - } else if ("800x600".equals(string)) { - width = 800; - height = 600; - } else if ("800x480".equals(string)) { - width = 800; - height = 480; - } else if ("480x800".equals(string)) { - width = 480; - height = 800; - } else { - width = 640; - height = 480; - } - offPanel.resizeGLView(width, height); - - SceneApplication.getApplication().enqueue(new Callable() { - - public Object call() throws Exception { - niftyDisplay.reshape(offPanel.getViewPort(), width, height); - return null; - } - }); - -// updatePreView(); - } - }); - toolBar.add(comboBox); - toolBar.add(new JPanel()); - setLayout(new java.awt.BorderLayout()); - add(toolBar, java.awt.BorderLayout.NORTH); - errors = new ErrorPanel(); - errors.setPreferredSize(new Dimension(0, 80)); - - - add(errors, java.awt.BorderLayout.SOUTH); - - } - - public void updatePreView() { - updatePreView(screen); - } - - public void updatePreView(final String screen) { - errors.clear(); - final ProjectAssetManager pm = niftyObject.getLookup().lookup(ProjectAssetManager.class); - if (pm == null) { - Logger.getLogger(NiftyPreviewPanel.class.getName()).log(Level.WARNING, "No Project AssetManager found!"); - } - InputStream stream = null; - try { - stream = niftyObject.getPrimaryFile().getInputStream(); - doc = XMLUtil.parse(new InputSource(stream), false, false, this, null); - NiftyFileNode rootContext = new NiftyFileNode(doc.getDocumentElement()); - setRoot(rootContext); - comp.setRootContext(rootContext); - } catch (Exception ex) { -// Message msg = new NotifyDescriptor.Message( -// "Error parsing File:" + ex, -// NotifyDescriptor.ERROR_MESSAGE); - // DialogDisplayer.getDefault().notifyLater(msg); - Exceptions.printStackTrace(ex); - // return; - } finally { - try { - if (stream != null) { - stream.close(); - } - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } - } - try { - - if (nifty != null) { - nifty.validateXml(niftyObject.getPrimaryFile().getPath()); - - } - } catch (Exception e) { - if (e instanceof SAXParseException) { - SAXParseException spe = (SAXParseException) e; - errors.addError("Line " + spe.getLineNumber() + " col :" + spe.getColumnNumber() + " : " + spe.getMessage()); - } else { - errors.addError(e.getMessage()); - } - Exceptions.printStackTrace(e); - } - SceneApplication.getApplication().enqueue(new Callable() { - - public Object call() throws Exception { - - try { - nifty.fromXml(pm.getRelativeAssetPath(niftyObject.getPrimaryFile().getPath()), screen); - if (screen == null || screen.length() == 0) { - Collection screens = nifty.getAllScreensName(); - for (Iterator it = screens.iterator(); it.hasNext();) { - String string = it.next(); - nifty.gotoScreen(string); - return null; - } - } - } catch (Exception ex) { - Message msg = new NotifyDescriptor.Message( - "Error opening File:" + ex, - NotifyDescriptor.ERROR_MESSAGE); - // DialogDisplayer.getDefault().notifyLater(msg); - Exceptions.printStackTrace(ex); - errors.addError(ex.getMessage()); - } - return null; - } - }); -// java.awt.EventQueue.invokeLater(new Runnable() { -// -// public void run() { -// validateTree(); -// } -// }); - } - - @Override - public void initComponents() { - super.initComponents(); - setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.PAGE_AXIS)); - createToolbar(); - scrollPanel = new JScrollPane(); - offPanel = new OffScenePanel(640, 480); - scrollPanel.getViewport().add(offPanel); - add(scrollPanel); - offPanel.startPreview(); - prepareInputHandler(); - } - - private void prepareInputHandler() { - inputHandler = new NiftyPreviewInputHandler(); - offPanel.addMouseMotionListener(new MouseMotionListener() { - - public void mouseDragged(MouseEvent e) { - inputHandler.addMouseEvent(e.getX(), e.getY(), e.getButton() == MouseEvent.NOBUTTON ? false : true); - } - - public void mouseMoved(MouseEvent e) { - inputHandler.addMouseEvent(e.getX(), e.getY(), e.getButton() == MouseEvent.NOBUTTON ? false : true); - } - }); - offPanel.addMouseListener(new MouseListener() { - - public void mouseClicked(MouseEvent e) { - } - - public void mousePressed(MouseEvent e) { - inputHandler.addMouseEvent(e.getX(), e.getY(), e.getButton() == MouseEvent.NOBUTTON ? false : true); - } - - public void mouseReleased(MouseEvent e) { - } - - public void mouseEntered(MouseEvent e) { - } - - public void mouseExited(MouseEvent e) { - } - }); - offPanel.addKeyListener(new KeyListener() { - - public void keyTyped(KeyEvent e) { - } - - public void keyPressed(KeyEvent e) { - inputHandler.addKeyEvent(e.getKeyCode(), e.getKeyChar(), true, e.isShiftDown(), e.isControlDown()); - } - - public void keyReleased(KeyEvent e) { - } - }); - } - - private void preparePreview() { - SceneApplication.getApplication().enqueue(new Callable() { - - public Object call() throws Exception { - ViewPort guiViewPort = offPanel.getViewPort(); - ProjectAssetManager pm = niftyObject.getLookup().lookup(ProjectAssetManager.class); - if (pm == null) { - Logger.getLogger(NiftyPreviewPanel.class.getName()).log(Level.WARNING, "No Project AssetManager found!"); - return null; - } - AudioRenderer audioRenderer = SceneApplication.getApplication().getAudioRenderer(); - niftyDisplay = new NiftyJmeDisplay(pm, - inputHandler, - audioRenderer, - guiViewPort); - nifty = niftyDisplay.getNifty(); - - // attach the nifty display to the gui view port as a processor - guiViewPort.addProcessor(niftyDisplay); - return null; - } - }); - } - - @Override - protected Error validateView() { - return null; - } - - @Override - public void showSelection(Node[] nodes) { - this.screen = nodes[0].getName(); - final String screen = this.screen; - SceneApplication.getApplication().enqueue(new Callable() { - - public Object call() throws Exception { - nifty.gotoScreen(screen); - return null; - } - }); - } - - public void cleanup() { - offPanel.stopPreview(); - SceneApplication.getApplication().enqueue(new Callable() { - - public Object call() throws Exception { - ViewPort guiViewPort = offPanel.getViewPort(); - guiViewPort.removeProcessor(niftyDisplay); - return null; - } - }); - } - - public void warning(SAXParseException exception) throws SAXException { - //errors.addWarning("Line " + exception.getLineNumber() + " : " + exception.getMessage()); - } - - public void error(SAXParseException exception) throws SAXException { - //errors.addError("Line " + exception.getLineNumber() + " : " + exception.getMessage()); - } - - public void fatalError(SAXParseException exception) throws SAXException { - //errors.addError("Line " + exception.getLineNumber() + " : " + exception.getMessage()); - } -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyScreenNode.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyScreenNode.java deleted file mode 100644 index f6a9fa08f..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/NiftyScreenNode.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package com.jme3.gde.gui.multiview; - -import org.openide.nodes.AbstractNode; -import org.openide.nodes.Children; - -/** - * - * @author normenhansen - */ -public class NiftyScreenNode extends AbstractNode{ - - public NiftyScreenNode(String name) { - super(Children.LEAF); - setName(name); - } - -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/PreviewToolbarElement.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/PreviewToolbarElement.java deleted file mode 100644 index 54ebf7999..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/PreviewToolbarElement.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package com.jme3.gde.gui.multiview; - -import com.jme3.gde.gui.OldNiftyGuiDataObject; -import org.netbeans.modules.xml.multiview.ToolBarMultiViewElement; -import org.netbeans.modules.xml.multiview.ui.SectionView; -import org.netbeans.modules.xml.multiview.ui.ToolBarDesignEditor; -import org.openide.nodes.Node; - -/** - * - * @author normenhansen - */ -public class PreviewToolbarElement extends ToolBarMultiViewElement { -// private NiftyGuiDataObject dObj; - private ToolBarDesignEditor comp; - private NiftyPreviewPanel viewPanel; - - public PreviewToolbarElement(OldNiftyGuiDataObject dObj) { - super(dObj); -// this.dObj = dObj; - comp = new ToolBarDesignEditor(); - setVisualEditor(comp); - viewPanel=new NiftyPreviewPanel(dObj, comp); - } - - @Override - public SectionView getSectionView() { - return null; - } - - @Override - public void componentShowing() { - super.componentShowing(); - viewPanel.updatePreView(); - } - - @Override - public void componentClosed() { - super.componentClosed(); - viewPanel.cleanup(); - } - -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/PreviewView.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/PreviewView.java deleted file mode 100644 index db63baa03..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/PreviewView.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.jme3.gde.gui.multiview; - -import com.jme3.gde.gui.OldNiftyGuiDataObject; -import org.netbeans.modules.xml.multiview.DesignMultiViewDesc; - -/** - * - * @author normenhansen - */ -public class PreviewView extends DesignMultiViewDesc { - - private int type; - - public PreviewView(OldNiftyGuiDataObject dObj, int type) { - super(dObj, "Design"); - this.type = type; - } - - public org.netbeans.core.spi.multiview.MultiViewElement createElement() { - OldNiftyGuiDataObject dObj = (OldNiftyGuiDataObject) getDataObject(); - return new PreviewToolbarElement(dObj); - } - - public java.awt.Image getIcon() { - return org.openide.util.Utilities.loadImage("com/jme3/gde/gui/Computer_File_043.gif"); //NOI18N - } - - public String preferredID() { - return "Toc_multiview_design" + String.valueOf(type); - } -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/XmlHelper.java b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/XmlHelper.java deleted file mode 100644 index b58865d7c..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/XmlHelper.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package com.jme3.gde.gui.multiview; - -import org.w3c.dom.Element; -import org.w3c.dom.Node; - -/** - * - * @author normenhansen - */ -public class XmlHelper { - public static Element findFirstChildElement(Element parent) { - org.w3c.dom.Node ret = parent.getFirstChild(); - while (ret != null && (!(ret instanceof Element))) { - ret = ret.getNextSibling(); - } - return (Element) ret; - } - - public static Element findChildElement(Element parent, String name) { - if (parent == null) { - return null; - } - org.w3c.dom.Node ret = parent.getFirstChild(); - while (ret != null && (!(ret instanceof Element) || !ret.getNodeName().equals(name))) { - ret = ret.getNextSibling(); - } - return (Element) ret; - } - - public static Element findNextElement(Node ret, String name) { - ret = ret.getNextSibling(); - while (ret != null && (!(ret instanceof Element) || !ret.getNodeName().equals(name))) { - ret = ret.getNextSibling(); - } - return (Element) ret; - } - - public static Element findChildElementWithAttribute(Element parent, String name, String attribute, String value) { - if (parent == null) { - return null; - } - org.w3c.dom.Node ret = parent.getFirstChild(); - while (ret != null && (!(ret instanceof Element) || !ret.getNodeName().equals(name) || ((Element)ret).getAttribute(attribute)==null || !((Element)ret).getAttribute(attribute).equals(value))) { - ret = ret.getNextSibling(); - } - return (Element) ret; - } - - public static Element findNextElementWithAttribute(Node ret, String name, String attribute, String value) { - ret = ret.getNextSibling(); - while (ret != null && (!(ret instanceof Element) || !ret.getNodeName().equals(name) || ((Element)ret).getAttribute(attribute)==null || !((Element)ret).getAttribute(attribute).equals(value))) { - ret = ret.getNextSibling(); - } - return (Element) ret; - } - - public static Element findNextSiblingElement(Element current) { - org.w3c.dom.Node ret = current.getNextSibling(); - while (ret != null) { - if (ret instanceof Element) { - return (Element) ret; - } - ret = ret.getNextSibling(); - } - return null; - } - -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/icons/Computer_File_043.gif b/sdk/jme3-gui/src/com/jme3/gde/gui/multiview/icons/Computer_File_043.gif new file mode 100644 index 0000000000000000000000000000000000000000..421d54335943f6eb085baa4fc48c26ff7758d7ce GIT binary patch literal 386 zcmZ?wbhEHb6krfwxXQrr|Nnn=W4p$_+5QoU;wlC^kDOn&aqsd?ds`;X`}XU9(}cMz zHt(CdXq|URTvPwt`1GQht{Hw|2{Gv<$+_iajeYe!Gt*1zW6}x>>w6me=0v9z{Q37k zFfzGg>cWJ~lI+sPik6Af7OmGXw%>p1O7ny{ITdZKljaxKcNf%jG*6sY**-P3pz7DZ z|4Dh3H62s(Dq1p%>dIRuNvIl0s2ZBu`*;P%dj`ju*n2bJ0E$0Zz%n`@667Zaw)qG6 zJRNkTI+ysd9>}qpD=NO=pk&1QFhAx8OpHp4n<{kVTp1L&7(Uf((o}EYn&7GVt}Dci z&tf5iAp=itbEAeng9HORH(MVYH+v_8zC42}gLLk!8S(}UVhnt097{RW_!cl2XfxVG!p(b&B6iiSfb1 LM-P-t9T}_vRGx&H literal 0 HcmV?d00001 diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/package-info.java b/sdk/jme3-gui/src/com/jme3/gde/gui/package-info.java index dc6ffbc7a..a7022bf6f 100644 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/package-info.java +++ b/sdk/jme3-gui/src/com/jme3/gde/gui/package-info.java @@ -2,8 +2,8 @@ * To change this template, choose Tools | Templates * and open the template in the editor. */ -@TemplateRegistrations(value = {@TemplateRegistration(folder = "GUI", displayName = "Empty Gui",content = "EmptyNiftyGui.xml"), -@TemplateRegistration(folder = "GUI", displayName = "HelloJme",content = "NiftyGui.xml")}) +@TemplateRegistrations(value = {@TemplateRegistration(folder = "GUI", displayName = "Empty Gui",content = "templates/EmptyNiftyGui.xml"), +@TemplateRegistration(folder = "GUI", displayName = "HelloJme",content = "templates/NiftyGui.xml")}) package com.jme3.gde.gui; import org.netbeans.api.templates.TemplateRegistration; diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/palette/JmePaletteUtilities.java b/sdk/jme3-gui/src/com/jme3/gde/gui/palette/JmePaletteUtilities.java deleted file mode 100644 index 9f508b349..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/palette/JmePaletteUtilities.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * 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.gui.palette; - -import javax.swing.text.BadLocationException; -import javax.swing.text.Caret; -import javax.swing.text.Document; -import javax.swing.text.JTextComponent; -import javax.swing.text.StyledDocument; -import org.openide.text.NbDocument; - -public class JmePaletteUtilities { - - public static void insert(final String s,final JTextComponent target) throws BadLocationException { - - final StyledDocument doc = (StyledDocument)target.getDocument(); - - class AtomicChange implements Runnable { - - public void run() { - Document value = target.getDocument(); - if (value == null) - return; - try { - insert(s, target, doc); - } catch (BadLocationException e) {} - } - } - - try { - NbDocument.runAtomicAsUser(doc, new AtomicChange()); - } catch (BadLocationException ex) {} - - } - - private static int insert(String s, JTextComponent target, Document doc) throws BadLocationException { - - int start = -1; - - try { - - //firstly, find selected text range: - Caret caret = target.getCaret(); - int p0 = Math.min(caret.getDot(), caret.getMark()); - int p1 = Math.max(caret.getDot(), caret.getMark()); - doc.remove(p0, p1 - p0); - - //then, replace selected text range with the inserted one: - start = caret.getDot(); - doc.insertString(start, s, null); - - } catch (BadLocationException ble) {} - - return start; - - } - -} \ No newline at end of file diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/palette/Screen.java b/sdk/jme3-gui/src/com/jme3/gde/gui/palette/Screen.java deleted file mode 100644 index 5a442cf62..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/palette/Screen.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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.gui.palette; -import javax.swing.text.BadLocationException; -import javax.swing.text.JTextComponent; -import org.openide.text.ActiveEditorDrop; - -/** - * - * @author normenhansen, zathras - */ -public class Screen implements ActiveEditorDrop { - - public Screen() { - } - - private String createBody() { - - String body = ""; - return body; - } - - public boolean handleTransfer(JTextComponent targetComponent) { - String body = createBody(); - try { - JmePaletteUtilities.insert(body, targetComponent); - } catch (BadLocationException ble) { - return false; - } - return true; - } - -} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/palette/Screen.xml b/sdk/jme3-gui/src/com/jme3/gde/gui/palette/Screen.xml deleted file mode 100644 index 1445bab56..000000000 --- a/sdk/jme3-gui/src/com/jme3/gde/gui/palette/Screen.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - Screen - Nifty-gui Screen - - \ No newline at end of file diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/templates/EmptyNiftyGui.xml b/sdk/jme3-gui/src/com/jme3/gde/gui/templates/EmptyNiftyGui.xml new file mode 100644 index 000000000..2e51c89de --- /dev/null +++ b/sdk/jme3-gui/src/com/jme3/gde/gui/templates/EmptyNiftyGui.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/templates/NiftyGui.xml b/sdk/jme3-gui/src/com/jme3/gde/gui/templates/NiftyGui.xml new file mode 100644 index 000000000..ec0bd6e31 --- /dev/null +++ b/sdk/jme3-gui/src/com/jme3/gde/gui/templates/NiftyGui.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/view/Navigator.java b/sdk/jme3-gui/src/com/jme3/gde/gui/view/Navigator.java new file mode 100644 index 000000000..11bd4c0c4 --- /dev/null +++ b/sdk/jme3-gui/src/com/jme3/gde/gui/view/Navigator.java @@ -0,0 +1,200 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.jme3.gde.gui.view; + +import com.jme3.gde.gui.nodes.GElementNode; +import com.jme3.gde.gui.nodes.GUINode; +import jada.ngeditor.controller.CommandProcessor; +import jada.ngeditor.controller.GUIEditor; +import jada.ngeditor.controller.commands.SelectCommand; +import jada.ngeditor.listeners.events.SelectionChanged; +import jada.ngeditor.model.GUI; +import jada.ngeditor.model.GuiEditorModel; +import jada.ngeditor.model.elements.GElement; +import java.awt.BorderLayout; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyVetoException; +import java.util.ArrayList; +import java.util.Observable; +import java.util.Observer; +import javax.swing.JComponent; +import org.netbeans.spi.navigator.NavigatorPanel; +import org.openide.explorer.ExplorerManager; +import org.openide.explorer.ExplorerUtils; +import org.openide.explorer.view.BeanTreeView; +import org.openide.nodes.AbstractNode; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.lookup.ProxyLookup; + +/** + * + * @author cris + */ +@NavigatorPanel.Registration(mimeType = "text/x-niftygui+xml", displayName="Gui View") +public class Navigator extends javax.swing.JPanel implements NavigatorPanel,ExplorerManager.Provider , Observer, PropertyChangeListener{ + private Lookup lookup; + private ExplorerManager mgr = new ExplorerManager(); + private final BeanTreeView beanTreeView; + /** + * Creates new form Navigator + */ + public Navigator() { + initComponents(); + setLayout(new BorderLayout()); + beanTreeView = new BeanTreeView(); + add(beanTreeView, BorderLayout.CENTER); + final GuiEditorModel model = (GuiEditorModel) CommandProcessor.getInstance().getObservable(); + model.addObserver(this); + if(model.getCurrent() != null){ + try { + this.intNavigator(model.getCurrent()); + } catch (PropertyVetoException ex) { + Exceptions.printStackTrace(ex); + } + } + + + } + + /** + * 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() { + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 244, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGap(0, 274, Short.MAX_VALUE) + ); + }// //GEN-END:initComponents + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables + + @Override + public String getDisplayName() { + return "GuiView"; + } + + @Override + public String getDisplayHint() { + return "Easy view for your gui"; + } + + @Override + public JComponent getComponent() { + return this; + } + + @Override + public void panelActivated(Lookup context) { + + } + + @Override + public void panelDeactivated() { + ExplorerUtils.activateActions(mgr, false); + } + + @Override + public Lookup getLookup() { + return lookup; + } + + @Override + public ExplorerManager getExplorerManager() { + return mgr; + } + + @Override + public void update(Observable o, Object arg) { + if(o instanceof GuiEditorModel){ + try { + GuiEditorModel model = (GuiEditorModel) o; + model.getCurrent().addObserver(this); + model.getCurrent().getSelection().addObserver(this); + this.intNavigator(model.getCurrent()); + } catch (PropertyVetoException ex) { + Exceptions.printStackTrace(ex); + } + } + + if(arg instanceof SelectionChanged){ + SelectionChanged event = (SelectionChanged) arg; + if(event.getNewSelection().isEmpty()){ + return; + } + ArrayList path = new ArrayList(); + GElement parent = ((SelectionChanged)arg).getElement(); + while(parent!=null){ + path.add(parent.getID()); + parent = parent.getParent(); + } + Node result = mgr.getRootContext(); + for(int i=path.size()-1;i>=0;i--){ + result = result.getChildren().findChild(path.get(i)); + } + try { + mgr.setSelectedNodes(new Node[]{result}); + } catch (PropertyVetoException ex) { + Exceptions.printStackTrace(ex); + } + } + beanTreeView.updateUI(); + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals(ExplorerManager.PROP_SELECTED_NODES)) { + Node[] newValue = (Node[]) evt.getNewValue(); + if (newValue.length > 0) { + AbstractNode firstSelected = (AbstractNode) newValue[0]; + if (firstSelected instanceof GElementNode) { + GElement element = ((GElementNode) firstSelected).getGelement(); + GUI gui = ((GUINode)mgr.getRootContext()).getGui(); + gui.getSelection().deleteObserver(this); // I don't wont to get notified about this selection change + SelectCommand command = CommandProcessor.getInstance().getCommand(SelectCommand.class); + command.setElement(element); + try { + CommandProcessor.getInstance().excuteCommand(command); + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + } + gui.getSelection().addObserver(this); + + } + } + } + } + + + private void intNavigator(GUI gui) throws PropertyVetoException { + + + ExplorerUtils.activateActions(mgr, true); + + + AbstractNode guiRoot = new GUINode(gui); + guiRoot.setName("Gui"); + this.mgr.setRootContext(guiRoot); + this.beanTreeView.updateUI(); + mgr.addPropertyChangeListener(this); + this.mgr.setSelectedNodes(new Node[]{guiRoot}); + Lookup lookup1 = ExplorerUtils.createLookup(mgr, getActionMap()); + lookup = new ProxyLookup(lookup1); + + } +} diff --git a/sdk/jme3-gui/src/com/jme3/gde/gui/view/NiftyGuiVisualElement.java b/sdk/jme3-gui/src/com/jme3/gde/gui/view/NiftyGuiVisualElement.java new file mode 100644 index 000000000..a459a2553 --- /dev/null +++ b/sdk/jme3-gui/src/com/jme3/gde/gui/view/NiftyGuiVisualElement.java @@ -0,0 +1,404 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.jme3.gde.gui.view; + +import com.jme3.app.Application; +import com.jme3.gde.core.assets.ProjectAssetManager; +import com.jme3.gde.gui.NiftyGuiDataObject; +import com.jme3.gde.gui.nodes.GElementNode; +import com.jme3.gde.gui.nodes.GUINode; +import de.lessvoid.nifty.Nifty; +import jada.ngeditor.controller.CommandProcessor; +import jada.ngeditor.controller.GUIEditor; +import jada.ngeditor.guiviews.DND.PaletteDropTarget; +import jada.ngeditor.guiviews.DND.TrasferHandling; +import jada.ngeditor.guiviews.J2DNiftyView; +import jada.ngeditor.listeners.events.SelectionChanged; +import jada.ngeditor.model.GUI; +import jada.ngeditor.model.GuiEditorModel; +import jada.ngeditor.model.elements.GElement; +import jada.ngeditor.model.elements.GLayer; +import jada.ngeditor.model.exception.NoProductException; +import jada.ngeditor.persistence.GUIWriter; +import java.awt.Dimension; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyVetoException; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Observable; +import java.util.Observer; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.Action; +import javax.swing.ActionMap; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JToolBar; +import javax.xml.bind.JAXBException; +import javax.xml.parsers.ParserConfigurationException; +import org.netbeans.api.progress.ProgressHandle; +import org.netbeans.api.progress.ProgressHandleFactory; +import org.netbeans.core.spi.multiview.CloseOperationState; +import org.netbeans.core.spi.multiview.MultiViewElement; +import org.netbeans.core.spi.multiview.MultiViewElementCallback; +import org.netbeans.spi.actions.AbstractSavable; +import org.openide.awt.UndoRedo; +import org.openide.explorer.ExplorerManager; +import org.openide.explorer.ExplorerUtils; +import org.openide.loaders.DataObject; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; +import org.openide.util.NbBundle.Messages; +import org.openide.util.lookup.AbstractLookup; +import org.openide.util.lookup.InstanceContent; +import org.openide.util.lookup.ProxyLookup; +import org.openide.windows.TopComponent; +import org.xml.sax.SAXException; +import sun.rmi.runtime.Log; + +@MultiViewElement.Registration( + displayName = "#LBL_NiftyGui_VISUAL", + iconBase = "com/jme3/gde/gui/multiview/icons/Computer_File_043.gif", + mimeType = "text/x-niftygui+xml", + persistenceType = TopComponent.PERSISTENCE_NEVER, + preferredID = "NiftyGuiVisual", + position = 2000) +@Messages("LBL_NiftyGui_VISUAL=Visual") +public final class NiftyGuiVisualElement extends JPanel implements MultiViewElement , ExplorerManager.Provider,Observer, PropertyChangeListener { + private static final Logger logger = Logger.getLogger(NiftyGuiVisualElement.class.getName()); + private NiftyGuiDataObject obj; + private JToolBar toolbar = new JToolBar(); + private transient MultiViewElementCallback callback; + private GUIEditor editor; + private final Nifty nifty; + private final J2DNiftyView view; + private final JComboBox layers = new JComboBox(); + private final ExplorerManager nodesManager; + private final UndoRedo.Manager undoSupport; + private int guiID; + private final InstanceContent content = new InstanceContent(); + private Lookup lookup; + + public NiftyGuiVisualElement(Lookup lkp) { + obj = lkp.lookup(NiftyGuiDataObject.class); + assert obj != null; + initComponents(); + view = new J2DNiftyView(800, 600); + view.init(); + this.scrollArea.getViewport().addChangeListener(view); + this.scrollArea.setViewportView(view); + TrasferHandling tranf = new TrasferHandling(); + PaletteDropTarget tmp = new PaletteDropTarget(); + editor = obj.getLookup().lookup(GUIEditor.class); + nodesManager = new ExplorerManager(); + nifty = view.getNifty(); + view.setTransferHandler(tranf); + view.setDropTarget(tmp); + // editor.addObserver(view); + // editor.addObserver(tranf); + this.obj.addPropertyChangeListener(this); + this.createToolbar(); + this.undoSupport = new UndoRedo.Manager(); + CommandProcessor.getInstance().setUndoManager(undoSupport); + this.content.set(Collections.singleton(obj.getNodeDelegate()), null); + lookup = new AbstractLookup(content); + } + /** + * Old code + * @author normenhansen + */ + private void createToolbar() { + toolbar.setPreferredSize(new Dimension(10000, 24)); + toolbar.setMaximumSize(new Dimension(10000, 24)); + toolbar.setFloatable(false); + toolbar.add(new JLabel("Change Resolution")); + JComboBox comboBox = new JComboBox(new String[]{"640x480", "480x800", "800x480", "800x600", "1024x768", "1280x720"}); + comboBox.addItemListener(new ItemListener() { + + public void itemStateChanged(ItemEvent e) { + String string = (String) e.getItem(); + if ("640x480".equals(string)) { + view.setResoltion(640, 480); + } else if ("1024x768".equals(string)) { + view.setResoltion(1024, 768); + } else if ("1280x720".equals(string)) { + view.setResoltion(1280, 720); + } else if ("800x600".equals(string)) { + view.setResoltion(800, 600); + } else if ("800x480".equals(string)) { + view.setResoltion(800, 480); + } else if ("480x800".equals(string)) { + view.setResoltion(480, 800); + } else { + view.setResoltion(800, 600); + } + } + }); + toolbar.add(comboBox); + comboBox.setSelectedItem("800x600"); + toolbar.add(new JLabel("Current Layer")); + layers.addItemListener(new ItemListener() { + + public void itemStateChanged(ItemEvent e) { + GLayer item = (GLayer) e.getItem(); + editor.selectElement(item); + } + }); + toolbar.add(layers); + } + @Override + public String getName() { + return "NiftyGuiVisualElement"; + } + + /** + * 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. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + scrollArea = new javax.swing.JScrollPane(); + + setLayout(new java.awt.BorderLayout()); + add(scrollArea, java.awt.BorderLayout.CENTER); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JScrollPane scrollArea; + // End of variables declaration//GEN-END:variables + @Override + public JComponent getVisualRepresentation() { + return this; + } + + @Override + public JComponent getToolbarRepresentation() { + return toolbar; + } + + @Override + public Action[] getActions() { + return new Action[0]; + } + + @Override + public Lookup getLookup() { + return this.lookup ; + } + /** + * Raw implementation , just to prototype the editor + */ + @Override + public void componentOpened() { + loadGui(); + } + + @Override + public void componentClosed() { + + } + /** + * Raw implementation , just to prototype the editor + */ + @Override + public void componentShowing() { + if(!this.obj.isModified()){ + return; + } + loadGui(); + + } + /** + * Raw implementation , just to prototype the editor + */ + @Override + public void componentHidden() { + String path = this.obj.getPrimaryFile().getPath(); + try { + this.editor.saveGui(path); + } catch (FileNotFoundException ex) { + Exceptions.printStackTrace(ex); + } catch (JAXBException ex) { + Exceptions.printStackTrace(ex); + } catch (NullPointerException ex){ + Exceptions.printStackTrace(ex); + } + } + + @Override + public void componentActivated() { + try{ + GuiEditorModel model = (GuiEditorModel) CommandProcessor.getInstance().getObservable(); + model.setCurrentGUI(guiID); + model.getCurrent().addObserver(this); + CommandProcessor.getInstance().setUndoManager(undoSupport); + }catch(java.lang.IllegalArgumentException ex){ + logger.log(Level.SEVERE,"Can't load your gui", ex); + } + } + + @Override + public void componentDeactivated() { + } + + @Override + public UndoRedo getUndoRedo() { + return this.undoSupport; + } + + @Override + public void setMultiViewCallback(MultiViewElementCallback callback) { + this.callback = callback; + } + + @Override + public CloseOperationState canCloseElement() { + return CloseOperationState.STATE_OK; + } + + @Override + public ExplorerManager getExplorerManager() { + return nodesManager; + } + + @Override + public void update(Observable o, Object arg) { + if(arg instanceof SelectionChanged ){ + SelectionChanged event = (SelectionChanged) arg; + if(event.getNewSelection().isEmpty()){ + return; + } + GElement parent = event.getElement(); + GElementNode node = new GElementNode(parent); + this.content.set(Collections.singleton(node), null); + + }else if(o instanceof GUI){ + //Add a save. We don't add multible savable because they cointains the same + //information about editing. + GuiSavable savable = this.lookup.lookup(GuiSavable.class); + if(savable == null){ + String path = this.obj.getPrimaryFile().getPath(); + final GuiSavable guiSavable = new NiftyGuiVisualElement.GuiSavable(((GUI)o),path); + this.content.add(guiSavable); + } + } + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if(evt.getPropertyName().equals(DataObject.PROP_MODIFIED)){ + boolean old = (Boolean)evt.getOldValue(); + boolean nev = (Boolean)evt.getNewValue(); + if(old && !nev){ + this.loadGui(); + } + } + + } + + private void loadGui() { + try { + ProgressHandle handle = ProgressHandleFactory.createHandle("Loading the gui file"); + InputStream is = this.obj.getPrimaryFile().getInputStream(); + handle.start(); + ProjectAssetManager mgr = this.obj.getLookup().lookup(ProjectAssetManager.class); + String assetPath = mgr.getAssetFolder().getPath(); + this.editor.createNewGui(nifty,is,new File(assetPath)); + this.view.newGui(this.editor.getGui()); + nodesManager.setRootContext(new GUINode(this.editor.getGui())); + this.editor.getGui().getSelection().addObserver(this); + Collection layers1 = this.editor.getGui().getLayers(); + guiID = this.editor.getGui().getGUIid(); + this.editor.getGui().addObserver(this); + DefaultComboBoxModel model = new DefaultComboBoxModel(layers1.toArray(new GLayer[0])); + layers.setModel(model); + layers.setSelectedItem(this.editor.getCurrentLayer()); + + handle.finish(); + } catch (ParserConfigurationException ex) { + Exceptions.printStackTrace(ex); + } catch (JAXBException ex) { + Exceptions.printStackTrace(ex); + } catch (ClassNotFoundException ex) { + Exceptions.printStackTrace(ex); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } catch (NoProductException ex) { + Exceptions.printStackTrace(ex); + } catch (SAXException ex) { + Exceptions.printStackTrace(ex); + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + } + + + + } + + private class GuiSavable extends AbstractSavable { + private final GUI gui; + + private final String filename; + + public GuiSavable(GUI gui,String filename){ + + this.gui = gui; + this.filename = filename; + this.register(); + + + } + @Override + protected String findDisplayName() { + return "Save "+ this.gui + " changes"; + } + + @Override + protected void handleSave() throws IOException { + try { + GUIWriter writer = new GUIWriter(this.gui); + writer.writeGUI(filename); + NiftyGuiVisualElement.this.content.remove(this); + + + } catch (FileNotFoundException ex) { + Exceptions.printStackTrace(ex); + } catch (JAXBException ex) { + Exceptions.printStackTrace(ex); + } catch (ClassNotFoundException ex) { + Exceptions.printStackTrace(ex); + } + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof com.jme3.gde.gui.view.NiftyGuiVisualElement.GuiSavable){ + return this.gui.equals(((com.jme3.gde.gui.view.NiftyGuiVisualElement.GuiSavable)obj).gui); + } + return false; + } + + @Override + public int hashCode() { + return this.gui.hashCode(); + } + +} +}