/*
* (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
*/
package org.f2o.absurdum.puck.gui.panels;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.List;
import java.util.Vector;
import javax.swing.BoxLayout;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import org.f2o.absurdum.puck.bsh.BeanShellCodeHolder;
import org.f2o.absurdum.puck.gui.graph.Arrow;
import org.f2o.absurdum.puck.gui.graph.RoomNode;
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.w3c.dom.Attr;
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 RoomPanel extends EntityPanel implements BeanShellCodeHolder
{
//private JTextField nameTextField = new EnhancedJTextField(20);
private JComboBox extendsComboBox = new JComboBox();
//privatize
public DescriptionListPanel dlp;
private ExtraDescriptionsPanel edp;
private BSHCodePanel bcp;
private PropertiesPanel pp;
//the tabbed pane
private JTabbedPane jtp;
private RoomNode node;
public RoomPanel(RoomNode node)
{
super();
nameTextField.setText("Room #"+getID());
this.node = node;
//add ( extendsComboBox );
}
public String toString()
{
return nameTextField.getText() + "##" + super.toString();
}
public String getNameForElement()
{
return nameTextField.getText();
}
public void linkWithGraph()
{
//System.out.println("Aaah. Refreshing.");
//(new Throwable()).printStackTrace();
//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);
Vector roomNodes =
this.getGraphEditingPanel().getRoomNodes(true);
extendsComboBox = new JComboBox ( new DefaultComboBoxModel ( roomNodes ) );
JPanel extendsPanel = new JPanel();
extendsPanel.add ( new JLabel(UIMessages.getInstance().getMessage("inherit.from")) );
extendsPanel.add( extendsComboBox );
firstTab.add(extendsPanel);
dlp = new DescriptionListPanel(5);
firstTab.add(dlp);
edp = new ExtraDescriptionsPanel(5);
firstTab.add(edp);
jtp.add("General",firstTab);
JPanel secondTab = new JPanel();
secondTab.setLayout(new BoxLayout(secondTab, BoxLayout.PAGE_AXIS));
bcp // = new JSyntaxBSHCodePanel("room",this);
= BSHCodePanelFactory.getInstance().createPanel("room",this);
//System.out.println("Setting " + this.hashCode() + "'s panel to " + bcp.hashCode());
secondTab.add(bcp);
pp = new PropertiesPanel();
secondTab.add(pp);
jtp.add(UIMessages.getInstance().getMessage("tab.codeprop"),secondTab);
TabUtils.setDefaultMnemonics(jtp);
}
public Node doGetXML ( Document d )
{
Element result = d.createElement("Room");
result.setAttribute("name",this.getPanelName());
if ( !extendsComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("none") ))
result.setAttribute("extends",extendsComboBox.getSelectedItem().toString());
result.appendChild((Element)dlp.getXML(d));
result.appendChild((Element)edp.getXML(d));
result.appendChild((Element)pp.getXML(d));
Element codeElt = ((Element)bcp.getXML(d));
if ( codeElt != null )
result.appendChild(codeElt);
//check arrows & gen. path XML, inventory XML and suchlike.
List arrows = node.getArrows();
//paths:
Element pathElt = d.createElement("PathList");
//items:
Element invElt = d.createElement("Inventory");
//moblist:
Element mobsElt = d.createElement("MobileList");
//custom relationships
//Element relationshipsElt = d.createElement("RelationshipList");
for ( int i = 0 ; i < arrows.size() ; i++ )
{
GraphElementPanel gep = ((Arrow)arrows.get(i)).getAssociatedPanel();
if ( gep instanceof PathPanel )
{
if ( ((PathPanel)gep).getRelationshipType().equals(UIMessages.getInstance().getMessage("structural.room.room")) ) //there is a path
{
pathElt.appendChild(((PathPanel)gep).getXML(d));
}
}
else if ( gep instanceof RoomHasCharPanel )
{
if ( ((RoomHasCharPanel)gep).getRelationshipType().equals(UIMessages.getInstance().getMessage("structural.room.char")) ) //there is a contains structural relationship to char
{
mobsElt.appendChild(((RoomHasCharPanel)gep).getXML(d));
}
}
else if ( gep instanceof RoomHasItemPanel )
{
if ( ((RoomHasItemPanel)gep).getRelationshipType().equals(UIMessages.getInstance().getMessage("structural.room.item")) ) //there is a contains structural relationship to item
{
invElt.appendChild(((RoomHasItemPanel)gep).getXML(d));
}
}
/*
* refactored up in hierarchy
if ( gep instanceof ArrowPanel ) //this if check will become unnecessary when custom relationship implementation is complete
{
ArrowPanel relPanel = (ArrowPanel) gep;
Node n = relPanel.getCustomRelationshipXML(d);
if ( n.hasChildNodes() ) //if it doesn't have children there are no custom relationships, would be worthless to append it
relationshipsElt.appendChild(n);
}
*/
}
Element relationshipsElt = (Element) getCustomRelationshipListXML(d,node);
result.appendChild(pathElt);
result.appendChild(invElt);
result.appendChild(mobsElt);
if ( relationshipsElt != null )
{
result.appendChild(relationshipsElt);
}
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 String getBSHCode()
{
if ( bcp == null ) forceRealInitFromXml(true); //code panel not yet initted.
return bcp.getCode();
}
/*
//begin cache stuff
private boolean initted = false;
private org.w3c.dom.Node cachedNode = null;
public void forceRealInitFromXml ( )
{
if ( !initted && cachedNode != null )
{
doInitFromXML(cachedNode);
initted = true;
cachedNode = null;
}
}
public void setVisible( boolean visible )
{
if ( visible ) forceRealInitFromXml();
super.setVisible(visible);
}
//rename to queueInitFromXML
public void initFromXML ( org.w3c.dom.Node n )
{
cachedNode = n;
}
//end cache stuff
*/
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"));
//extends, clones cb
if ( e.hasAttribute("extends") )
{
int extendsInd = indexOf ( extendsComboBox.getModel() , e.getAttribute("extends") );
if ( extendsInd >= 0 )
{
extendsComboBox.setSelectedIndex(extendsInd);
}
}
//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);
if ( edesListElt != null )
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);
if ( plElt != null )
pp.initFromXML(plElt);
}
public String getPanelName()
{
return nameTextField.getText();
}
}