UndoSupport, now the editor will reload the gui only if file is changed and some property editors. Also xml auto completition and XmlNavigator
parent
f1071fd05b
commit
ba848391dd
Binary file not shown.
@ -1,10 +1,10 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<nifty xmlns="http://nifty-gui.sourceforge.net/nifty-1.3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd http://nifty-gui.sourceforge.net/nifty-1.3.xsd"> |
||||
<!-- +++++++++++++++++++++++++++++++++++++++ --> |
||||
<!-- start screen --> |
||||
<!-- +++++++++++++++++++++++++++++++++++++++ --> |
||||
<screen id="GScreen0" controller="mygame.Main"> |
||||
<layer id="GLayer0" childLayout="absolute"> |
||||
</layer> |
||||
</screen> |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<nifty xmlns="http://nifty-gui.lessvoid.com/nifty-gui" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd https://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd"> |
||||
<!-- +++++++++++++++++++++++++++++++++++++++ --> |
||||
<!-- start screen --> |
||||
<!-- +++++++++++++++++++++++++++++++++++++++ --> |
||||
<screen id="GScreen0" controller="mygame.Main"> |
||||
<layer id="GLayer0" childLayout="absolute"> |
||||
</layer> |
||||
</screen> |
||||
</nifty> |
@ -1,191 +1,202 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.gui; |
||||
|
||||
import com.jme3.gde.gui.nodes.GElementNode; |
||||
import com.jme3.gde.gui.nodes.ScreenChildFactory; |
||||
import jada.ngeditor.controller.GUIEditor; |
||||
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.Children; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.util.Exceptions; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.LookupEvent; |
||||
import org.openide.util.LookupListener; |
||||
import org.openide.util.Utilities; |
||||
import org.openide.util.lookup.ProxyLookup; |
||||
import org.openide.windows.TopComponent; |
||||
|
||||
/** |
||||
* |
||||
* @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, LookupListener{ |
||||
private Lookup lookup; |
||||
private ExplorerManager mgr = new ExplorerManager(); |
||||
private final BeanTreeView beanTreeView; |
||||
private GUIEditor editor; |
||||
private Lookup context; |
||||
private boolean lock; |
||||
/** |
||||
* Creates new form Navigator |
||||
*/ |
||||
public Navigator() { |
||||
initComponents(); |
||||
setLayout(new BorderLayout()); |
||||
beanTreeView = new BeanTreeView(); |
||||
add(beanTreeView, BorderLayout.CENTER); |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 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") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//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) |
||||
); |
||||
}// </editor-fold>//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) { |
||||
try { |
||||
this.context = context; |
||||
context.lookupResult(NiftyGuiDataObject.class).addLookupListener(this); |
||||
intNavigator(context); |
||||
} catch (PropertyVetoException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
|
||||
@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) { |
||||
|
||||
jada.ngeditor.listeners.actions.Action act = ( jada.ngeditor.listeners.actions.Action) arg; |
||||
if(act.getType() == jada.ngeditor.listeners.actions.Action.SEL){ |
||||
ArrayList<String> path = new ArrayList<String>(); |
||||
GElement parent = act.getGUIElement(); |
||||
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); |
||||
} |
||||
}else if(act.getType() == jada.ngeditor.listeners.actions.Action.NEW){ |
||||
try { |
||||
this.intNavigator(context); |
||||
} 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(); |
||||
|
||||
editor.selectElement(element); |
||||
|
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void resultChanged(LookupEvent ev) { |
||||
try { |
||||
intNavigator(context); |
||||
} catch (PropertyVetoException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
|
||||
private void intNavigator(Lookup context) throws PropertyVetoException { |
||||
|
||||
NiftyGuiDataObject man = context.lookup(NiftyGuiDataObject.class); |
||||
ExplorerUtils.activateActions(mgr, true); |
||||
editor = man.getLookup().lookup(GUIEditor.class); |
||||
AbstractNode guiRoot = new AbstractNode(Children.create(new ScreenChildFactory(editor.getGui()), true)); |
||||
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); |
||||
editor.addObserver(this); |
||||
} |
||||
} |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.gui; |
||||
|
||||
import com.jme3.gde.gui.nodes.GElementNode; |
||||
import com.jme3.gde.gui.nodes.GUINode; |
||||
import com.jme3.gde.gui.nodes.ScreenChildFactory; |
||||
import jada.ngeditor.controller.CommandProcessor; |
||||
import jada.ngeditor.controller.GUIEditor; |
||||
import jada.ngeditor.controller.commands.SelectCommand; |
||||
import jada.ngeditor.listeners.events.ReloadGuiEvent; |
||||
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.Children; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.util.Exceptions; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.LookupEvent; |
||||
import org.openide.util.LookupListener; |
||||
import org.openide.util.Utilities; |
||||
import org.openide.util.lookup.ProxyLookup; |
||||
import org.openide.windows.TopComponent; |
||||
|
||||
/** |
||||
* |
||||
* @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; |
||||
private GUIEditor editor; |
||||
private Lookup context; |
||||
private boolean lock; |
||||
/** |
||||
* Creates new form Navigator |
||||
*/ |
||||
public Navigator() { |
||||
initComponents(); |
||||
setLayout(new BorderLayout()); |
||||
beanTreeView = new BeanTreeView(); |
||||
add(beanTreeView, BorderLayout.CENTER); |
||||
CommandProcessor.getInstance().getObservable().addObserver(this); |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 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") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//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) |
||||
); |
||||
}// </editor-fold>//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<String> path = new ArrayList<String>(); |
||||
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 { |
||||
lock = true; |
||||
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); |
||||
|
||||
} |
||||
} |
||||
|
@ -1,148 +1,149 @@ |
||||
/* |
||||
* 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 jada.ngeditor.controller.GUIEditor; |
||||
import java.io.IOException; |
||||
import org.netbeans.api.project.Project; |
||||
import org.netbeans.api.project.ProjectManager; |
||||
import org.netbeans.core.spi.multiview.MultiViewElement; |
||||
import org.netbeans.core.spi.multiview.text.MultiViewEditorElement; |
||||
import org.openide.awt.ActionID; |
||||
import org.openide.awt.ActionReference; |
||||
import org.openide.awt.ActionReferences; |
||||
import org.openide.filesystems.FileObject; |
||||
import org.openide.filesystems.MIMEResolver; |
||||
import org.openide.loaders.DataNode; |
||||
import org.openide.loaders.DataObject; |
||||
import org.openide.loaders.DataObjectExistsException; |
||||
import org.openide.loaders.MultiDataObject; |
||||
import org.openide.loaders.MultiFileLoader; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.NbBundle.Messages; |
||||
import org.openide.windows.TopComponent; |
||||
|
||||
@Messages({ |
||||
"LBL_NiftyGui_LOADER=Files of NiftyGui" |
||||
}) |
||||
@MIMEResolver.Registration( |
||||
displayName = "#LBL_NiftyGui_LOADER", |
||||
resource = "NiftyGuiResolver.xml") |
||||
@DataObject.Registration( |
||||
mimeType = "text/x-niftygui+xml", |
||||
iconBase = "com/jme3/gde/gui/Computer_File_043.gif", |
||||
displayName = "#LBL_NiftyGui_LOADER", |
||||
position = 300) |
||||
@ActionReferences({ |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.OpenAction"), |
||||
position = 100, |
||||
separatorAfter = 200), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "Edit", id = "org.openide.actions.CutAction"), |
||||
position = 300), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), |
||||
position = 400, |
||||
separatorAfter = 500), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), |
||||
position = 600), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.RenameAction"), |
||||
position = 700, |
||||
separatorAfter = 800), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), |
||||
position = 900, |
||||
separatorAfter = 1000), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), |
||||
position = 1100, |
||||
separatorAfter = 1200), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.ToolsAction"), |
||||
position = 1300), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), |
||||
position = 1400) |
||||
}) |
||||
public class NiftyGuiDataObject extends MultiDataObject { |
||||
|
||||
public NiftyGuiDataObject(FileObject pf, MultiFileLoader loader) throws DataObjectExistsException, IOException { |
||||
super(pf, loader); |
||||
registerEditor("text/x-niftygui+xml", true); |
||||
findAssetManager(); |
||||
this.getCookieSet().assign(GUIEditor.class,new GUIEditor()); |
||||
} |
||||
|
||||
protected final 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) { |
||||
this.getCookieSet().assign(mgr.getClass(),mgr); |
||||
return; |
||||
} |
||||
} |
||||
} catch (IOException ex) { |
||||
} catch (IllegalArgumentException ex) { |
||||
} |
||||
} |
||||
file = file.getParent(); |
||||
} |
||||
} |
||||
|
||||
@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 int associateLookup() { |
||||
return 1; |
||||
} |
||||
|
||||
@MultiViewElement.Registration( |
||||
displayName = "#LBL_NiftyGui_EDITOR", |
||||
iconBase = "com/jme3/gde/gui/Computer_File_043.gif", |
||||
mimeType = "text/x-niftygui+xml", |
||||
persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, |
||||
preferredID = "NiftyGui", |
||||
position = 1000) |
||||
@Messages("LBL_NiftyGui_EDITOR=XML") |
||||
public static MultiViewEditorElement createEditor(Lookup lkp) { |
||||
final MultiViewEditorElement multiViewEditorElement = new MultiViewEditorElement(lkp); |
||||
return multiViewEditorElement; |
||||
} |
||||
} |
||||
/* |
||||
* 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 jada.ngeditor.controller.CommandProcessor; |
||||
import jada.ngeditor.controller.GUIEditor; |
||||
import java.io.IOException; |
||||
import org.netbeans.api.project.Project; |
||||
import org.netbeans.api.project.ProjectManager; |
||||
import org.netbeans.core.spi.multiview.MultiViewElement; |
||||
import org.netbeans.core.spi.multiview.text.MultiViewEditorElement; |
||||
import org.openide.awt.ActionID; |
||||
import org.openide.awt.ActionReference; |
||||
import org.openide.awt.ActionReferences; |
||||
import org.openide.filesystems.FileObject; |
||||
import org.openide.filesystems.MIMEResolver; |
||||
import org.openide.loaders.DataNode; |
||||
import org.openide.loaders.DataObject; |
||||
import org.openide.loaders.DataObjectExistsException; |
||||
import org.openide.loaders.MultiDataObject; |
||||
import org.openide.loaders.MultiFileLoader; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.NbBundle.Messages; |
||||
import org.openide.windows.TopComponent; |
||||
|
||||
@Messages({ |
||||
"LBL_NiftyGui_LOADER=Files of NiftyGui" |
||||
}) |
||||
@MIMEResolver.Registration( |
||||
displayName = "#LBL_NiftyGui_LOADER", |
||||
resource = "NiftyGuiResolver.xml") |
||||
@DataObject.Registration( |
||||
mimeType = "text/x-niftygui+xml", |
||||
iconBase = "com/jme3/gde/gui/Computer_File_043.gif", |
||||
displayName = "#LBL_NiftyGui_LOADER", |
||||
position = 300) |
||||
@ActionReferences({ |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.OpenAction"), |
||||
position = 100, |
||||
separatorAfter = 200), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "Edit", id = "org.openide.actions.CutAction"), |
||||
position = 300), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), |
||||
position = 400, |
||||
separatorAfter = 500), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), |
||||
position = 600), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.RenameAction"), |
||||
position = 700, |
||||
separatorAfter = 800), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), |
||||
position = 900, |
||||
separatorAfter = 1000), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), |
||||
position = 1100, |
||||
separatorAfter = 1200), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.ToolsAction"), |
||||
position = 1300), |
||||
@ActionReference( |
||||
path = "Loaders/text/x-niftygui+xml/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), |
||||
position = 1400) |
||||
}) |
||||
public class NiftyGuiDataObject extends MultiDataObject { |
||||
|
||||
public NiftyGuiDataObject(FileObject pf, MultiFileLoader loader) throws DataObjectExistsException, IOException { |
||||
super(pf, loader); |
||||
registerEditor("text/x-niftygui+xml", true); |
||||
findAssetManager(); |
||||
this.getCookieSet().assign(GUIEditor.class, CommandProcessor.getInstance().getGuiEditor()); |
||||
} |
||||
|
||||
protected final 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) { |
||||
this.getCookieSet().assign(mgr.getClass(),mgr); |
||||
return; |
||||
} |
||||
} |
||||
} catch (IOException ex) { |
||||
} catch (IllegalArgumentException ex) { |
||||
} |
||||
} |
||||
file = file.getParent(); |
||||
} |
||||
} |
||||
|
||||
@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 int associateLookup() { |
||||
return 1; |
||||
} |
||||
|
||||
@MultiViewElement.Registration( |
||||
displayName = "#LBL_NiftyGui_EDITOR", |
||||
iconBase = "com/jme3/gde/gui/Computer_File_043.gif", |
||||
mimeType = "text/x-niftygui+xml", |
||||
persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, |
||||
preferredID = "NiftyGui", |
||||
position = 1000) |
||||
@Messages("LBL_NiftyGui_EDITOR=XML") |
||||
public static MultiViewEditorElement createEditor(Lookup lkp) { |
||||
final MultiViewEditorElement multiViewEditorElement = new MultiViewEditorElement(lkp); |
||||
return multiViewEditorElement; |
||||
} |
||||
} |
||||
|
@ -1,332 +1,335 @@ |
||||
/* |
||||
* 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.core.scene.SceneApplication; |
||||
import com.jme3.gde.gui.nodes.GUINode; |
||||
import com.jme3.gde.gui.palette.NiftyGUIPaletteFactory; |
||||
import de.lessvoid.nifty.Nifty; |
||||
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.model.elements.GElement; |
||||
import jada.ngeditor.model.elements.GLayer; |
||||
import jada.ngeditor.model.exception.NoProductException; |
||||
import java.awt.Dimension; |
||||
import java.awt.dnd.DropTarget; |
||||
import java.awt.dnd.DropTargetDragEvent; |
||||
import java.awt.dnd.DropTargetDropEvent; |
||||
import java.awt.dnd.DropTargetEvent; |
||||
import java.awt.dnd.DropTargetListener; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
import java.beans.PropertyVetoException; |
||||
import java.io.File; |
||||
import java.io.FileNotFoundException; |
||||
import java.io.IOException; |
||||
import java.util.ArrayList; |
||||
import java.util.Collection; |
||||
import java.util.Observable; |
||||
import java.util.Observer; |
||||
import java.util.concurrent.Callable; |
||||
import javax.swing.Action; |
||||
import javax.swing.ActionMap; |
||||
import javax.swing.DefaultComboBoxModel; |
||||
import javax.swing.JComboBox; |
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JToolBar; |
||||
import javax.swing.text.AbstractDocument; |
||||
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.openide.DialogDisplayer; |
||||
import org.openide.NotifyDescriptor; |
||||
import org.openide.awt.UndoRedo; |
||||
import org.openide.explorer.ExplorerManager; |
||||
import org.openide.explorer.ExplorerUtils; |
||||
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; |
||||
|
||||
@MultiViewElement.Registration( |
||||
displayName = "#LBL_NiftyGui_VISUAL", |
||||
iconBase = "com/jme3/gde/gui/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 { |
||||
|
||||
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; |
||||
|
||||
|
||||
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); |
||||
editor.addObserver(this); |
||||
nodesManager = new ExplorerManager(); |
||||
nifty = view.getNifty(); |
||||
view.setTransferHandler(tranf); |
||||
view.setDropTarget(tmp); |
||||
editor.addObserver(view); |
||||
editor.addObserver(tranf); |
||||
editor.addObserver(tmp); |
||||
this.createToolbar(); |
||||
} |
||||
/** |
||||
* Old code |
||||
* @author normenhansen |
||||
*/ |
||||
private void createToolbar() { |
||||
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)) { |
||||
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"); |
||||
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. |
||||
*/ |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
scrollArea = new javax.swing.JScrollPane(); |
||||
|
||||
setLayout(new java.awt.BorderLayout()); |
||||
add(scrollArea, java.awt.BorderLayout.CENTER); |
||||
}// </editor-fold>//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 ExplorerUtils.createLookup(nodesManager, new ActionMap()); |
||||
} |
||||
/** |
||||
* Raw implementation , just to prototype the editor |
||||
*/ |
||||
@Override |
||||
public void componentOpened() { |
||||
try { |
||||
ProgressHandle handle = ProgressHandleFactory.createHandle("Loading the gui file"); |
||||
String path = this.obj.getPrimaryFile().getPath(); |
||||
ProjectAssetManager mgr = obj.getLookup().lookup(ProjectAssetManager.class); |
||||
String assetPath = mgr.getAssetFolder().getPath(); |
||||
handle.progress(50); |
||||
this.editor.createNewGui(nifty,new File(path),new File(assetPath)); |
||||
nodesManager.setRootContext(new GUINode(this.editor.getGui())); |
||||
Collection<GLayer> layers1 = this.editor.getGui().getLayers(); |
||||
DefaultComboBoxModel<GLayer> model = new DefaultComboBoxModel<GLayer>(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); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void componentClosed() { |
||||
} |
||||
/** |
||||
* Raw implementation , just to prototype the editor |
||||
*/ |
||||
@Override |
||||
public void componentShowing() { |
||||
try { |
||||
ProgressHandle handle = ProgressHandleFactory.createHandle("Loading the gui file"); |
||||
String path = this.obj.getPrimaryFile().getPath(); |
||||
ProjectAssetManager mgr = this.obj.getLookup().lookup(ProjectAssetManager.class); |
||||
String assetPath = mgr.getAssetFolder().getPath(); |
||||
this.editor.createNewGui(nifty,new File(path),new File(assetPath)); |
||||
nodesManager.setRootContext(new GUINode(this.editor.getGui())); |
||||
Collection<GLayer> layers1 = this.editor.getGui().getLayers(); |
||||
DefaultComboBoxModel<GLayer> model = new DefaultComboBoxModel<GLayer>(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); |
||||
} |
||||
|
||||
} |
||||
/** |
||||
* 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); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void componentActivated() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentDeactivated() { |
||||
} |
||||
|
||||
@Override |
||||
public UndoRedo getUndoRedo() { |
||||
return UndoRedo.NONE; |
||||
} |
||||
|
||||
@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) { |
||||
jada.ngeditor.listeners.actions.Action act = ( jada.ngeditor.listeners.actions.Action) arg; |
||||
if(act.getType() == jada.ngeditor.listeners.actions.Action.SEL){ |
||||
ArrayList<String> path = new ArrayList<String>(); |
||||
GElement parent = act.getGUIElement(); |
||||
while(parent!=null){ |
||||
path.add(parent.getID()); |
||||
parent = parent.getParent(); |
||||
} |
||||
|
||||
Node result = nodesManager.getRootContext(); |
||||
|
||||
for(int i=path.size()-1;i>=0 && result!=null;i--){ |
||||
result = result.getChildren().findChild(path.get(i)); |
||||
} |
||||
try { |
||||
if(result!=null){ |
||||
nodesManager.setSelectedNodes(new Node[]{result}); |
||||
} |
||||
} catch (PropertyVetoException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
/* |
||||
* 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.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.GuiEditorModel; |
||||
import jada.ngeditor.model.elements.GElement; |
||||
import jada.ngeditor.model.elements.GLayer; |
||||
import jada.ngeditor.model.exception.NoProductException; |
||||
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.Observable; |
||||
import java.util.Observer; |
||||
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.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.windows.TopComponent; |
||||
import org.xml.sax.SAXException; |
||||
import sun.rmi.runtime.Log; |
||||
|
||||
@MultiViewElement.Registration( |
||||
displayName = "#LBL_NiftyGui_VISUAL", |
||||
iconBase = "com/jme3/gde/gui/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 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; |
||||
|
||||
|
||||
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); |
||||
} |
||||
/** |
||||
* 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. |
||||
*/ |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
scrollArea = new javax.swing.JScrollPane(); |
||||
|
||||
setLayout(new java.awt.BorderLayout()); |
||||
add(scrollArea, java.awt.BorderLayout.CENTER); |
||||
}// </editor-fold>//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 ExplorerUtils.createLookup(nodesManager, new ActionMap()); |
||||
} |
||||
/** |
||||
* 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() { |
||||
GuiEditorModel model = (GuiEditorModel) CommandProcessor.getInstance().getObservable(); |
||||
model.setCurrentGUI(guiID); |
||||
CommandProcessor.getInstance().setUndoManager(undoSupport); |
||||
} |
||||
|
||||
@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; |
||||
} |
||||
ArrayList<String> path = new ArrayList<String>(); |
||||
GElement parent = event.getElement(); |
||||
while(parent!=null){ |
||||
path.add(parent.getID()); |
||||
parent = parent.getParent(); |
||||
} |
||||
|
||||
Node result = nodesManager.getRootContext(); |
||||
|
||||
for(int i=path.size()-1;i>=0 && result!=null;i--){ |
||||
result = result.getChildren().findChild(path.get(i)); |
||||
} |
||||
try { |
||||
if(result!=null){ |
||||
nodesManager.setSelectedNodes(new Node[]{result}); |
||||
} |
||||
} catch (PropertyVetoException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@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(); |
||||
|
||||
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<GLayer> layers1 = this.editor.getGui().getLayers(); |
||||
guiID = this.editor.getGui().getGUIid(); |
||||
DefaultComboBoxModel<GLayer> model = new DefaultComboBoxModel<GLayer>(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); |
||||
} |
||||
} |
||||
} |
||||
|
@ -1,10 +1,19 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd"> |
||||
<filesystem> |
||||
<folder name="NiftyPalette"> |
||||
<folder name="Items"> |
||||
<file name="Screen" url="com/jme3/gde/gui/palette/Screen.xml"> |
||||
</file> |
||||
</folder> |
||||
</folder> |
||||
</filesystem> |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd"> |
||||
<filesystem> |
||||
<folder name="NiftyPalette"> |
||||
<folder name="Items"> |
||||
<file name="Screen" url="com/jme3/gde/gui/palette/Screen.xml"> |
||||
</file> |
||||
</folder> |
||||
</folder> |
||||
<folder name="Navigator"> |
||||
<folder name="Panels"> |
||||
<folder name="text"> |
||||
<folder name="x-niftygui+xml"> |
||||
<file name="org-netbeans-modules-xml-text-navigator-XMLNavigatorPanel.instance"/> |
||||
</folder> |
||||
</folder> |
||||
</folder> |
||||
</folder> |
||||
</filesystem> |
||||
|
@ -1,97 +1,117 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.gui.nodes; |
||||
|
||||
import jada.ngeditor.model.elements.GElement; |
||||
import java.beans.PropertyEditor; |
||||
import java.lang.reflect.InvocationTargetException; |
||||
import java.util.Map.Entry; |
||||
import org.openide.nodes.AbstractNode; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.nodes.Sheet; |
||||
|
||||
/** |
||||
* |
||||
* @author cris |
||||
*/ |
||||
public class GElementNode extends AbstractNode{ |
||||
private final GElement element; |
||||
|
||||
public GElementNode(GElement element) { |
||||
super(Children.create(new GElementChildFactory(element), false)); |
||||
|
||||
this.element = element; |
||||
this.setName(element.getID()); |
||||
|
||||
} |
||||
|
||||
public GElement getGelement(){ |
||||
return element; |
||||
} |
||||
|
||||
public void updateChildren(){ |
||||
|
||||
} |
||||
@Override |
||||
protected Sheet createSheet() { |
||||
Sheet s = super.createSheet(); |
||||
Sheet.Set set = s.get(Sheet.PROPERTIES); |
||||
if (set == null) { |
||||
set = Sheet.createPropertiesSet(); |
||||
s.put(set); |
||||
} |
||||
set.setName("Element Properties"); |
||||
set.setShortDescription("You can set element properties"); |
||||
for(Entry<String,String> pair : this.element.listAttributes().entrySet()){ |
||||
set.put(new ElementAttributeProperty(element,pair.getKey())); |
||||
} |
||||
s.put(set); |
||||
return s; |
||||
} |
||||
|
||||
public class ElementAttributeProperty extends Node.Property { |
||||
|
||||
private String attributeName; |
||||
private GElement element; |
||||
|
||||
public ElementAttributeProperty(GElement element, String attributeName) { |
||||
super(String.class); |
||||
this.element = element; |
||||
this.attributeName = attributeName; |
||||
this.setName(attributeName); |
||||
this.setDisplayName(attributeName); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean canRead() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public String getValue() throws IllegalAccessException, InvocationTargetException{ |
||||
return element.getAttribute(attributeName); |
||||
} |
||||
|
||||
@Override |
||||
public boolean canWrite() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public PropertyEditor getPropertyEditor() { |
||||
return super.getPropertyEditor(); //To change body of generated methods, choose Tools | Templates.
|
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
public void setValue(Object val) throws IllegalAccessException, IllegalArgumentException { |
||||
element.addAttribute(attributeName, val.toString()); |
||||
element.refresh(); |
||||
} |
||||
}; |
||||
} |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.gui.nodes; |
||||
|
||||
import com.jme3.gde.gui.propertyeditors.ResourceEditor; |
||||
import com.jme3.gde.gui.propertyeditors.SizeEditor; |
||||
import jada.ngeditor.model.elements.GElement; |
||||
import java.beans.PropertyEditor; |
||||
import java.lang.reflect.InvocationTargetException; |
||||
import java.util.Map.Entry; |
||||
import org.openide.nodes.AbstractNode; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.nodes.Sheet; |
||||
import sun.beans.editors.BoolEditor; |
||||
import sun.beans.editors.BooleanEditor; |
||||
|
||||
/** |
||||
* |
||||
* @author cris |
||||
*/ |
||||
public class GElementNode extends AbstractNode{ |
||||
private final GElement element; |
||||
|
||||
public GElementNode(GElement element) { |
||||
super(Children.create(new GElementChildFactory(element), false)); |
||||
|
||||
this.element = element; |
||||
this.setName(element.getID()); |
||||
|
||||
} |
||||
|
||||
public GElement getGelement(){ |
||||
return element; |
||||
} |
||||
|
||||
public void updateChildren(){ |
||||
|
||||
} |
||||
@Override |
||||
protected Sheet createSheet() { |
||||
Sheet s = super.createSheet(); |
||||
Sheet.Set set = s.get(Sheet.PROPERTIES); |
||||
if (set == null) { |
||||
set = Sheet.createPropertiesSet(); |
||||
s.put(set); |
||||
} |
||||
set.setName("Element Properties"); |
||||
set.setShortDescription("You can set element properties"); |
||||
for(Entry<String,String> pair : this.element.listAttributes().entrySet()){ |
||||
final ElementAttributeProperty elementAttributeProperty = new ElementAttributeProperty(element,pair.getKey()); |
||||
pickEditor(pair, elementAttributeProperty); |
||||
set.put(elementAttributeProperty); |
||||
} |
||||
s.put(set); |
||||
return s; |
||||
} |
||||
|
||||
private void pickEditor(Entry<String, String> pair, final ElementAttributeProperty elementAttributeProperty) { |
||||
if(pair.getKey().equals("width")||pair.getKey().equals("height") || pair.getKey().equals("x") || pair.getKey().equals("y") ){ |
||||
elementAttributeProperty.setPropertyEditor(new SizeEditor()); |
||||
}else if(pair.getKey().equals("filename")){ |
||||
elementAttributeProperty.setPropertyEditor(new ResourceEditor()); |
||||
} |
||||
|
||||
} |
||||
|
||||
public class ElementAttributeProperty extends Node.Property { |
||||
|
||||
private String attributeName; |
||||
private GElement element; |
||||
private PropertyEditor editor; |
||||
|
||||
public ElementAttributeProperty(GElement element, String attributeName) { |
||||
super(String.class); |
||||
this.element = element; |
||||
this.attributeName = attributeName; |
||||
this.setName(attributeName); |
||||
this.setDisplayName(attributeName); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean canRead() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public String getValue() throws IllegalAccessException, InvocationTargetException{ |
||||
return element.getAttribute(attributeName); |
||||
} |
||||
|
||||
@Override |
||||
public boolean canWrite() { |
||||
return true; |
||||
} |
||||
|
||||
public void setPropertyEditor(PropertyEditor editor){ |
||||
this.editor = editor; |
||||
} |
||||
@Override |
||||
public PropertyEditor getPropertyEditor() { |
||||
|
||||
return this.editor; //To change body of generated methods, choose Tools | Templates.
|
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
public void setValue(Object val) throws IllegalAccessException, IllegalArgumentException { |
||||
element.addAttribute(attributeName, val.toString()); |
||||
element.refresh(); |
||||
} |
||||
}; |
||||
} |
||||
|
@ -0,0 +1,71 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.gui.propertyeditors; |
||||
|
||||
import jada.ngeditor.controller.CommandProcessor; |
||||
import jada.ngeditor.guiviews.editors.FileChooserEditor; |
||||
import jada.ngeditor.model.GuiEditorModel; |
||||
import java.awt.Component; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.beans.PropertyEditorSupport; |
||||
import java.io.File; |
||||
import java.util.Observable; |
||||
import java.util.Observer; |
||||
import javax.swing.JFileChooser; |
||||
|
||||
/** |
||||
* |
||||
* @author cris |
||||
*/ |
||||
public class ResourceEditor extends PropertyEditorSupport implements Observer, ActionListener{ |
||||
private final FileChooserEditor fileChooserEditor; |
||||
private File assetFolder; |
||||
|
||||
|
||||
public ResourceEditor() { |
||||
CommandProcessor.getInstance().getObservable().addObserver(this); |
||||
|
||||
GuiEditorModel model = (GuiEditorModel) CommandProcessor.getInstance().getObservable(); |
||||
this.assetFolder = model.getCurrent().getAssetFolder(); |
||||
fileChooserEditor = new FileChooserEditor(this.assetFolder); |
||||
fileChooserEditor.getFileChooser().addActionListener(this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Component getCustomEditor() { |
||||
|
||||
return fileChooserEditor.getFileChooser(); //To change body of generated methods, choose Tools | Templates.
|
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsCustomEditor() { |
||||
return true; //To change body of generated methods, choose Tools | Templates.
|
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
public void update(Observable o, Object arg) { |
||||
if(o instanceof GuiEditorModel){ |
||||
GuiEditorModel model = (GuiEditorModel) o; |
||||
this.assetFolder = model.getCurrent().getAssetFolder(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
if (JFileChooser.APPROVE_SELECTION.equals(e.getActionCommand())) { |
||||
this.setValue(fileChooserEditor.traslateFile()); |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,59 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.gui.propertyeditors; |
||||
|
||||
import java.awt.Component; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.beans.PropertyEditorSupport; |
||||
import java.beans.PropertyVetoException; |
||||
import java.beans.VetoableChangeListener; |
||||
import javax.swing.JLabel; |
||||
import org.openide.explorer.propertysheet.ExPropertyEditor; |
||||
import org.openide.explorer.propertysheet.PropertyEnv; |
||||
|
||||
/** |
||||
* |
||||
* @author cris |
||||
*/ |
||||
public class SizeEditor extends PropertyEditorSupport implements ExPropertyEditor, PropertyChangeListener{ |
||||
private PropertyEnv env; |
||||
|
||||
@Override |
||||
public void setAsText(String text) throws IllegalArgumentException { |
||||
super.setAsText(text); //To change body of generated methods, choose Tools | Templates.
|
||||
} |
||||
|
||||
@Override |
||||
public String getAsText() { |
||||
return super.getAsText(); //To change body of generated methods, choose Tools | Templates.
|
||||
} |
||||
|
||||
@Override |
||||
public Component getCustomEditor() { |
||||
jada.ngeditor.guiviews.editors.SizeEditor editor = new jada.ngeditor.guiviews.editors.SizeEditor(); |
||||
editor.setValue(this.getValue()); |
||||
editor.addPropertyChangeListener(this); |
||||
return editor.getComponent(); //To change body of generated methods, choose Tools | Templates.
|
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsCustomEditor() { |
||||
return true; //To change body of generated methods, choose Tools | Templates.
|
||||
} |
||||
|
||||
@Override |
||||
public void attachEnv(PropertyEnv env) { |
||||
this.env = env; |
||||
} |
||||
|
||||
@Override |
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
this.setValue(evt.getNewValue()); |
||||
} |
||||
|
||||
|
||||
|
||||
} |
Loading…
Reference in new issue