/*
* (c) 2005-2009 Carlos G�mez Rodr�guez, todos los derechos reservados / all rights reserved.
* Licencia en license/bsd.txt / License in license/bsd.txt
*
* Created at regulus on 20-jul-2005 18:51:54
* as file EntityPanel.java on package org.f2o.absurdum.puck.gui.panels
*/
//TODO Add spell-specifics
package org.f2o.absurdum.puck.gui.panels;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.List;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import org.f2o.absurdum.puck.bsh.BeanShellCodeHolder;
import org.f2o.absurdum.puck.gui.graph.AbstractEntityNode;
import org.f2o.absurdum.puck.gui.graph.Arrow;
import org.f2o.absurdum.puck.gui.graph.ItemNode;
import org.f2o.absurdum.puck.gui.graph.SpellNode;
import org.f2o.absurdum.puck.gui.panels.code.BSHCodePanel;
import org.f2o.absurdum.puck.gui.panels.code.BSHCodePanelFactory;
import org.f2o.absurdum.puck.gui.panels.code.JSyntaxBSHCodePanel;
import org.f2o.absurdum.puck.i18n.UIMessages;
import org.f2o.absurdum.puck.util.swing.EnhancedJTextField;
import org.f2o.absurdum.puck.util.xml.DOMUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import eu.irreality.age.windowing.TabUtils;
/**
* @author carlos
*
* Created at regulus, 20-jul-2005 18:51:54
*/
public class AbstractEntityPanel extends EntityPanel implements BeanShellCodeHolder
{
private EnhancedJTextField typeTextField = new EnhancedJTextField(20);
private JComboBox extendsComboBox = new JComboBox();
private JComboBox clonesComboBox = new JComboBox();
/*
private JCheckBox containerBox = new JCheckBox(Messages.getInstance().getMessage("checkbox.container"));
*/
//privatize
//public DescriptionListPanel dlp;
//private ExtraDescriptionsPanel edp;
private BSHCodePanel bcp;
private PropertiesPanel pp;
/*
private DescriptionListPanel snp; //sing names
private DescriptionListPanel pnp; //plur names
*/
/*
private PathCommandsPanel srn; //sing refnames
private PathCommandsPanel prn; //sing refnames
*/
//openable-closable support
/*
private DescriptionListPanel odp;
private DescriptionListPanel cdp;
private DescriptionListPanel ldp;
private DescriptionListPanel udp;
private JCheckBox oBox = new JCheckBox(Messages.getInstance().getMessage("checkbox.openable"));
private JCheckBox cBox = new JCheckBox(Messages.getInstance().getMessage("checkbox.closeable"));
private JCheckBox lBox = new JCheckBox(Messages.getInstance().getMessage("checkbox.lockable"));
private JCheckBox uBox = new JCheckBox(Messages.getInstance().getMessage("checkbox.unlockable"));
*/
//the tabbed pane
private JTabbedPane jtp;
private AbstractEntityNode node;
public AbstractEntityPanel( AbstractEntityNode node )
{
super();
nameTextField.setText("Abstract Entity #"+getID());
this.node = node;
//add ( extendsComboBox );
}
public String toString()
{
return nameTextField.getText() + "##" + super.toString();
}
public String getPanelName()
{
return nameTextField.getText();
}
public String getBSHCode()
{
if ( bcp == null ) forceRealInitFromXml(true); //code panel not yet initted.
return bcp.getCode();
}
public void linkWithGraph()
{
//no donut for ewe!
this.removeAll();
//we do need a tabbed pane!
jtp = new JTabbedPane();
this.add(jtp);
JPanel firstTab = new JPanel();
firstTab.setLayout(new BoxLayout(firstTab, BoxLayout.PAGE_AXIS));
JPanel namePanel = new JPanel();
namePanel.add(new JLabel(UIMessages.getInstance().getMessage("entity.uniquename")));
namePanel.add(nameTextField);
firstTab.add(namePanel);
JPanel typePanel = new JPanel();
typePanel.add(new JLabel(UIMessages.getInstance().getMessage("entity.type")));
typePanel.add(typeTextField);
firstTab.add(typePanel);
//TODO: Maybe add effect nodes here
/*
Vector itemNodes =
this.getGraphEditingPanel().getItemNodes();
extendsComboBox = new JComboBox ( new DefaultComboBoxModel ( itemNodes ) );
clonesComboBox = new JComboBox ( new DefaultComboBoxModel ( itemNodes ) );
*/
Vector abstractEntityNodes = this.getGraphEditingPanel().getNodes(AbstractEntityNode.class,true);
extendsComboBox = new JComboBox ( new DefaultComboBoxModel ( abstractEntityNodes ) );
clonesComboBox = new JComboBox ( new DefaultComboBoxModel ( abstractEntityNodes ) );
JPanel extendsPanel = new JPanel();
extendsPanel.add ( new JLabel(UIMessages.getInstance().getMessage("inherit.from")) );
extendsPanel.add ( extendsComboBox );
firstTab.add(extendsPanel);
JPanel clonesPanel = new JPanel();
clonesPanel.add ( new JLabel(UIMessages.getInstance().getMessage("clone.from")) );
clonesPanel.add ( clonesComboBox );
firstTab.add(clonesPanel);
/*
JPanel genderPanel = new JPanel();
genderComboBox = new JComboBox ( new String[] { Messages.getInstance().getMessage("gender.m") , Messages.getInstance().getMessage("gender.f") } );
genderPanel.add(new JLabel(Messages.getInstance().getMessage("gender")));
genderPanel.add(genderComboBox);
firstTab.add(genderPanel);
*/
/*
JPanel weightVolPanel = new JPanel();
weightVolPanel.add(new JLabel(Messages.getInstance().getMessage("item.weight")));
weightVolPanel.add(tfWeight);
weightVolPanel.add(new JLabel(Messages.getInstance().getMessage("item.volume")));
weightVolPanel.add(tfVolume);
firstTab.add(weightVolPanel);
*/
/*
JPanel contPanel = new JPanel();
contPanel.add(containerBox);
firstTab.add(contPanel);
dlp = new DescriptionListPanel();
firstTab.add(dlp);
edp = new ExtraDescriptionsPanel();
firstTab.add(edp);
*/
jtp.add("General",firstTab);
//JPanel thirdTab = new JPanel();
/*
thirdTab.setLayout(new BoxLayout(thirdTab, BoxLayout.PAGE_AXIS));
snp = new DescriptionListPanel(Messages.getInstance().getMessage("label.singnames"),Messages.getInstance().getMessage("label.name"));
thirdTab.add(snp);
pnp = new DescriptionListPanel(Messages.getInstance().getMessage("label.plurnames"),Messages.getInstance().getMessage("label.name"));
thirdTab.add(pnp);
*/
/*
srn = new PathCommandsPanel(Messages.getInstance().getMessage("label.singrefnames"),Messages.getInstance().getMessage("label.name"),true);
thirdTab.add(srn);
prn = new PathCommandsPanel(Messages.getInstance().getMessage("label.plurrefnames"),Messages.getInstance().getMessage("label.name"),true);
thirdTab.add(prn);
*/
//jtp.add(Messages.getInstance().getMessage("tab.names"),thirdTab);
JPanel secondTab = new JPanel();
secondTab.setLayout(new BoxLayout(secondTab, BoxLayout.PAGE_AXIS));
//bcp = new JSyntaxBSHCodePanel("abstract entity",this);
bcp = BSHCodePanelFactory.getInstance().createPanel("world",this);
secondTab.add(bcp);
pp = new PropertiesPanel();
secondTab.add(pp);
jtp.add(UIMessages.getInstance().getMessage("tab.codeprop"),secondTab);
//openable-closeable support
/*
JPanel fourthTab = new JPanel();
//JScrollPane fourthTabScroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JPanel fourthTabReal = new JPanel();
fourthTab.setLayout(new BorderLayout());
fourthTabReal.setLayout(new BoxLayout(fourthTabReal, BoxLayout.PAGE_AXIS));
JPanel openableFlagsPanel = new JPanel();
openableFlagsPanel.setBorder(BorderFactory.createTitledBorder(Messages.getInstance().getMessage("flags.openable")));
openableFlagsPanel.setLayout(new BoxLayout(openableFlagsPanel, BoxLayout.PAGE_AXIS));
openableFlagsPanel.add(oBox);
openableFlagsPanel.add(cBox);
openableFlagsPanel.add(lBox);
openableFlagsPanel.add(uBox);
fourthTabReal.add(openableFlagsPanel);
odp = new DescriptionListPanel(Messages.getInstance().getMessage("label.opendes"),Messages.getInstance().getMessage("label.description"),true);
cdp = new DescriptionListPanel(Messages.getInstance().getMessage("label.closedes"),Messages.getInstance().getMessage("label.description"),true);
ldp = new DescriptionListPanel(Messages.getInstance().getMessage("label.lockdes"),Messages.getInstance().getMessage("label.description"),true);
udp = new DescriptionListPanel(Messages.getInstance().getMessage("label.unlockdes"),Messages.getInstance().getMessage("label.description"),true);
JScrollPane innerScroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JPanel innerPanel = new JPanel();
innerPanel.setLayout( new BoxLayout(innerPanel, BoxLayout.PAGE_AXIS) );
innerPanel.add(odp);
innerPanel.add(cdp);
innerPanel.add(ldp);
innerPanel.add(udp);
innerScroll.setViewportView(innerPanel);
innerScroll.setPreferredSize(new Dimension(0,400));
fourthTabReal.add(innerScroll);
//fourthTabScroll.setViewportView(fourthTabReal);
//fourthTab.add(fourthTabScroll,BorderLayout.CENTER);
//jtp.add(Messages.getInstance().getMessage("tab.openclose"),fourthTab);
jtp.add(Messages.getInstance().getMessage("tab.openclose"),fourthTabReal);
*/
TabUtils.setDefaultMnemonics(jtp);
}
public Node doGetXML ( Document d )
{
Element result = d.createElement("AbstractEntity");
result.setAttribute("name",this.getPanelName());
if ( typeTextField.getText().length() > 0 )
result.setAttribute("type",typeTextField.getText());
/*
result.setAttribute("weight",tfWeight.getText());
result.setAttribute("volume",tfWeight.getText());
String genderString = (String) genderComboBox.getSelectedItem();
if (genderString.equals(Messages.getInstance().getMessage("gender.m")))
result.setAttribute("gender","1");
else
result.setAttribute("gender","0");
*/
if ( !extendsComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("none") ))
result.setAttribute("extends",extendsComboBox.getSelectedItem().toString());
if ( !clonesComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("none") ))
result.setAttribute("clones",clonesComboBox.getSelectedItem().toString());
/*
result.setAttribute("openable",String.valueOf(oBox.isSelected()));
result.setAttribute("closeable",String.valueOf(cBox.isSelected()));
result.setAttribute("lockable",String.valueOf(lBox.isSelected()));
result.setAttribute("unlockable",String.valueOf(uBox.isSelected()));
*/
//names
/*
result.appendChild(snp.getXML(d,"SingularNames"));
result.appendChild(pnp.getXML(d,"PluralNames"));
*/
/*
result.appendChild(srn.getXMLForNames(d,"SingularReferenceNames"));
result.appendChild(prn.getXMLForNames(d,"PluralReferenceNames"));
*/
/*
result.appendChild((Element)dlp.getXML(d));
result.appendChild((Element)edp.getXML(d));
*/
//open-close-lock-unlock descriptions
/*
Element openDes = (Element)odp.getXML(d,"OpenDescriptionList");
if ( openDes.hasChildNodes() || oBox.isSelected() )
result.appendChild(openDes);
Element closeDes = (Element)cdp.getXML(d,"CloseDescriptionList");
if ( closeDes.hasChildNodes() || cBox.isSelected() )
result.appendChild(closeDes);
Element lockDes = (Element)ldp.getXML(d,"LockDescriptionList");
if ( lockDes.hasChildNodes() || lBox.isSelected() )
result.appendChild(lockDes);
Element unlockDes = (Element)udp.getXML(d,"UnlockDescriptionList");
if ( unlockDes.hasChildNodes() || uBox.isSelected() )
result.appendChild(unlockDes);
*/
//properties, code
result.appendChild((Element)pp.getXML(d));
Element codeElt = ((Element)bcp.getXML(d));
if ( codeElt != null )
result.appendChild(codeElt);
List arrows = node.getArrows();
/*
Element partsElt = null;
Element keysElt = null;
*/
//for ( int i = 0 ; i < arrows.size() ; i++ )
//{
// GraphElementPanel gep = ((Arrow)arrows.get(i)).getAssociatedPanel();
/*
if ( gep instanceof ItemHasItemPanel )
{
ItemHasItemPanel relPanel = (ItemHasItemPanel) gep;
String relType = relPanel.getRelationshipType();
if ( relType.equals(Messages.getInstance().getMessage("structural.item.item.contain")) ) //containment relationship
{
if ( invElt == null ) invElt = d.createElement("Inventory");
invElt.appendChild( relPanel.getXML(d) );
}
if ( relType.equals(Messages.getInstance().getMessage("structural.item.item.haspart")) ) //has-part relationship
{
if ( partsElt == null ) partsElt = d.createElement("Inventory");
partsElt.appendChild( relPanel.getXML(d) );
}
if ( relType.equals(Messages.getInstance().getMessage("structural.item.item.haskey")) ) //has-key relationship
{
if ( keysElt == null ) keysElt = d.createElement("Inventory");
keysElt.appendChild( relPanel.getXML(d) );
}
}
*/
//}
Element relationshipsElt = (Element) getCustomRelationshipListXML ( d , node );
if ( relationshipsElt != null )
{
result.appendChild(relationshipsElt);
}
/*
if ( partsElt != null )
{
Element tempElt = d.createElement("Parts");
tempElt.appendChild(partsElt);
result.appendChild(tempElt);
}
if ( keysElt != null )
{
Element tempElt = d.createElement("KeyList");
tempElt.appendChild(keysElt);
result.appendChild(tempElt);
}
*/
return result;
}
//returns the index of the object in v whose name is s.
private int indexOf ( ComboBoxModel v , String s )
{
for ( int i = 0 ; i < v.getSize() ; i++ )
{
if ( s.equals(v.getElementAt(i).toString()) )
return i;
}
return -1;
}
public void doInitMinimal( org.w3c.dom.Node e )
{
nameTextField.setText(((org.w3c.dom.Element)e).getAttribute("name"));
}
// from Mobile node
public void doInitFromXML ( org.w3c.dom.Node n )
{
linkWithGraph();
Element e = (Element) n;
//name
nameTextField.setText(e.getAttribute("name"));
//type
typeTextField.setText(e.getAttribute("type"));
//extends, clones cb
if ( e.hasAttribute("extends") )
{
int extendsInd = indexOf ( extendsComboBox.getModel() , e.getAttribute("extends") );
if ( extendsInd >= 0 )
{
extendsComboBox.setSelectedIndex(extendsInd);
}
}
if ( e.hasAttribute("clones") )
{
int clonesInd = indexOf ( clonesComboBox.getModel() , e.getAttribute("clones") );
if ( clonesInd >= 0 )
{
clonesComboBox.setSelectedIndex(clonesInd);
}
}
//openable, closeable, etc. flags
/*
if ( e.hasAttribute("openable") ) oBox.setSelected( Boolean.parseBoolean( e.getAttribute("openable") ) );
if ( e.hasAttribute("closeable") ) cBox.setSelected( Boolean.parseBoolean( e.getAttribute("closeable") ) );
if ( e.hasAttribute("lockable") ) lBox.setSelected( Boolean.parseBoolean( e.getAttribute("lockable") ) );
if ( e.hasAttribute("unlockable") ) uBox.setSelected( Boolean.parseBoolean( e.getAttribute("unlockable") ) );
*/
/*
//description list panel
NodeList desNl = e.getElementsByTagName("DescriptionList");
Element desListElt = (Element) desNl.item(0);
dlp.initFromXML(desListElt);
//extra descriptions panel
NodeList edesNl = e.getElementsByTagName("ExtraDescriptionList");
Element edesListElt = (Element) edesNl.item(0);
edp.initFromXML(edesListElt);
*/
//bsh code panel
NodeList codeNl = e.getElementsByTagName("Code");
if ( codeNl.getLength() > 0 )
{
Element codeListElt = (Element) codeNl.item(0);
bcp.initFromXML(codeListElt);
}
//properties panel
NodeList plNl = e.getElementsByTagName("PropertyList");
Element plElt = (Element) plNl.item(0);
pp.initFromXML(plElt);
//sing names panel
/*
desNl = e.getElementsByTagName("SingularNames");
desListElt = (Element) desNl.item(0);
snp.initFromXML(desListElt);
//plur names panel
desNl = e.getElementsByTagName("PluralNames");
desListElt = (Element) desNl.item(0);
pnp.initFromXML(desListElt);
*/
//sing ref names panel
/*
NodeList srnNl = e.getElementsByTagName("SingularReferenceNames");
Element srnListElt = (Element) srnNl.item(0);
srn.initFromXML(srnListElt);
//plural ref names panel
NodeList prnNl = e.getElementsByTagName("PluralReferenceNames");
Element prnListElt = (Element) prnNl.item(0);
prn.initFromXML(prnListElt);
*/
//open descriptions panel
/*
NodeList desOp = e.getElementsByTagName("OpenDescriptionList");
if ( desOp.getLength() > 0 )
{
Element openDesListElt = (Element) desOp.item(0);
odp.initFromXML(openDesListElt);
}
//close descriptions panel
NodeList desCl = e.getElementsByTagName("CloseDescriptionList");
if ( desCl.getLength() > 0 )
{
Element closeDesListElt = (Element) desCl.item(0);
cdp.initFromXML(closeDesListElt);
}
//lock descriptions panel
NodeList desLck = e.getElementsByTagName("LockDescriptionList");
if ( desLck.getLength() > 0 )
{
Element lockDesListElt = (Element) desLck.item(0);
ldp.initFromXML(lockDesListElt);
}
//unlock descriptions panel
NodeList desUnl = e.getElementsByTagName("UnlockDescriptionList");
if ( desUnl.getLength() > 0 )
{
Element unlockDesListElt = (Element) desUnl.item(0);
udp.initFromXML(unlockDesListElt);
}
*/
//if it has inventory, then it is a container. Inventory is not initted here.
//All inventories are initted at WorldPanel.
/*
NodeList invs = DOMUtils.getDirectChildrenElementsByTagName(e,"Inventory");
if ( invs.getLength() > 0 )
containerBox.setSelected(true);
//weight, volume textfields
tfWeight.setText(e.getAttribute("weight"));
tfVolume.setText(e.getAttribute("volume"));
//gender combo box
if ( e.getAttribute("gender").equals("0") )
genderComboBox.setSelectedIndex(1);
else
genderComboBox.setSelectedIndex(0);
*/
}
}