/* * (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.JCheckBox; 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.CharacterNode; 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.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import eu.irreality.age.windowing.TabUtils; /** * @author carlos * * Created at regulus, 20-jul-2005 18:51:54 */ public class CharPanel extends EntityPanel implements BeanShellCodeHolder { private JComboBox extendsComboBox = new JComboBox(); private JComboBox clonesComboBox = new JComboBox(); //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 private SkillsPanel sp; //teh 1337 5ki11z //the tabbed pane private JTabbedPane jtp; private CharacterNode node; private JTextField tfHP = new EnhancedJTextField("10",3); private JTextField tfMaxHP = new EnhancedJTextField("10",3); private JTextField tfMP = new EnhancedJTextField("10",3); private JTextField tfMaxMP = new EnhancedJTextField("10",3); private JComboBox genderComboBox = new JComboBox(); private JCheckBox cbPlayer = new JCheckBox(UIMessages.getInstance().getMessage("char.isplayer")); public boolean isPlayer ( ) { return cbPlayer.isSelected(); } public void setPlayer ( boolean val ) { cbPlayer.setSelected(val); } public CharPanel( CharacterNode node ) { super(); nameTextField.setText("Character #"+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); Vector charNodes = this.getGraphEditingPanel().getCharNodes(true); extendsComboBox = new JComboBox ( new DefaultComboBoxModel ( charNodes ) ); clonesComboBox = new JComboBox ( new DefaultComboBoxModel ( charNodes ) ); 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[] { UIMessages.getInstance().getMessage("gender.m") , UIMessages.getInstance().getMessage("gender.f") } ); genderPanel.add(new JLabel(UIMessages.getInstance().getMessage("gender"))); genderPanel.add(genderComboBox); //firstTab.add(genderPanel); JPanel playerPanel = new JPanel(); playerPanel.add(cbPlayer); //firstTab.add(playerPanel); JPanel playerGenderPanel = new JPanel(); playerGenderPanel.add(genderPanel); playerGenderPanel.add(playerPanel); firstTab.add(playerGenderPanel); /* JPanel hpPanel = new JPanel(); hpPanel.add(new JLabel(UIMessages.getInstance().getMessage("char.hp"))); hpPanel.add(tfHP); hpPanel.add(new JLabel(UIMessages.getInstance().getMessage("char.hpmax"))); hpPanel.add(tfMaxHP); firstTab.add(hpPanel); JPanel mpPanel = new JPanel(); mpPanel.add(new JLabel(UIMessages.getInstance().getMessage("char.mp"))); mpPanel.add(tfMP); mpPanel.add(new JLabel(UIMessages.getInstance().getMessage("char.mpmax"))); mpPanel.add(tfMaxMP); firstTab.add(mpPanel); */ JPanel hpmpPanel = new JPanel(); //hpmpPanel.setLayout(new BoxLayout(hpmpPanel,BoxLayout.LINE_AXIS)); JPanel hpPanel = new JPanel(); hpPanel.add(new JLabel(UIMessages.getInstance().getMessage("char.hp"))); hpPanel.add(tfHP); hpmpPanel.add(hpPanel); JPanel maxhpPanel = new JPanel(); maxhpPanel.add(new JLabel(UIMessages.getInstance().getMessage("char.hpmax"))); maxhpPanel.add(tfMaxHP); hpmpPanel.add(maxhpPanel); JPanel mpPanel = new JPanel(); mpPanel.add(new JLabel(UIMessages.getInstance().getMessage("char.mp"))); mpPanel.add(tfMP); hpmpPanel.add(mpPanel); JPanel maxmpPanel = new JPanel(); maxmpPanel.add(new JLabel(UIMessages.getInstance().getMessage("char.mpmax"))); maxmpPanel.add(tfMaxMP); hpmpPanel.add(maxmpPanel); //JPanel hpmpPanelWrapper = new JPanel(); //hpmpPanelWrapper.add(hpmpPanel); //firstTab.add(hpmpPanelWrapper); firstTab.add(hpmpPanel); dlp = new DescriptionListPanel(5); firstTab.add(dlp); edp = new ExtraDescriptionsPanel(5); firstTab.add(edp); jtp.add("General",firstTab); JPanel thirdTab = new JPanel(); thirdTab.setLayout(new BoxLayout(thirdTab, BoxLayout.PAGE_AXIS)); snp = new DescriptionListPanel(UIMessages.getInstance().getMessage("label.singnames"),UIMessages.getInstance().getMessage("label.name"),false,true,1); thirdTab.add(snp); pnp = new DescriptionListPanel(UIMessages.getInstance().getMessage("label.plurnames"),UIMessages.getInstance().getMessage("label.name"),1); thirdTab.add(pnp); srn = new PathCommandsPanel(UIMessages.getInstance().getMessage("label.singrefnames"),UIMessages.getInstance().getMessage("label.name"),true); thirdTab.add(srn); prn = new PathCommandsPanel(UIMessages.getInstance().getMessage("label.plurrefnames"),UIMessages.getInstance().getMessage("label.name"),true); thirdTab.add(prn); jtp.add(UIMessages.getInstance().getMessage("tab.names"),thirdTab); JPanel secondTab = new JPanel(); secondTab.setLayout(new BoxLayout(secondTab, BoxLayout.PAGE_AXIS)); bcp = //new JSyntaxBSHCodePanel("mobile",this); BSHCodePanelFactory.getInstance().createPanel("mobile",this); secondTab.add(bcp); pp = new PropertiesPanel(); secondTab.add(pp); jtp.add(UIMessages.getInstance().getMessage("tab.codeprop"),secondTab); JPanel traitsTab = new JPanel(); traitsTab.setLayout(new BoxLayout(traitsTab, BoxLayout.PAGE_AXIS)); sp = new SkillsPanel(); traitsTab.add(sp); jtp.add(UIMessages.getInstance().getMessage("tab.traits"),traitsTab); TabUtils.setDefaultMnemonics(jtp); } public Node doGetXML ( Document d ) { Element result = d.createElement("Mobile"); result.setAttribute("name",this.getPanelName()); //result.setAttribute("hp",tfHP.getText()); result.setAttribute("hp",String.valueOf(getIntegerFromField(tfHP,20))); //result.setAttribute("mp",tfMP.getText()); result.setAttribute("mp",String.valueOf(getIntegerFromField(tfMP,20))); //result.setAttribute("maxhp",tfMaxHP.getText()); result.setAttribute("maxhp",String.valueOf(getIntegerFromField(tfMaxHP,20))); //result.setAttribute("maxmp",tfMaxMP.getText()); result.setAttribute("maxmp",String.valueOf(getIntegerFromField(tfMaxMP,20))); String genderString = (String) genderComboBox.getSelectedItem(); if (genderString.equals(UIMessages.getInstance().getMessage("gender.m"))) result.setAttribute("gender","true"); else result.setAttribute("gender","false"); 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()); //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)); result.appendChild((Element)pp.getXML(d)); Element codeElt = ((Element)bcp.getXML(d)); if ( codeElt != null ) result.appendChild(codeElt); Element traitsElt = d.createElement("Traits"); traitsElt.appendChild(sp.getXML(d)); result.appendChild(traitsElt); List arrows = node.getArrows(); //items: Element invElt = d.createElement("Inventory"); Element partsElt = null; Element spellsElt = null; //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 CharHasItemPanel ) { CharHasItemPanel relPanel = (CharHasItemPanel) gep; String relType = relPanel.getRelationshipType(); if ( relType.equals(UIMessages.getInstance().getMessage("structural.char.item.carry")) ) //carry relationship { if ( invElt == null ) invElt = d.createElement("Inventory"); invElt.appendChild( relPanel.getXML(d) ); } if ( relType.equals(UIMessages.getInstance().getMessage("structural.char.item.haspart")) ) //has-part relationship { if ( partsElt == null ) partsElt = d.createElement("Inventory"); partsElt.appendChild( relPanel.getXML(d) ); } } if ( gep instanceof CharHasSpellPanel ) { CharHasSpellPanel relPanel = (CharHasSpellPanel) gep; String relType = relPanel.getRelationshipType(); if ( relType.equals(UIMessages.getInstance().getMessage("structural.char.spell.know")) ) //know relationship { if ( spellsElt == null ) spellsElt = d.createElement("SpellList"); spellsElt.appendChild( relPanel.getXML(d) ); } } /* //refactored upwards to EntityPanel 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); if ( invElt != null ) result.appendChild(invElt); if ( partsElt != null ) { Element tempElt = d.createElement("Parts"); tempElt.appendChild(partsElt); result.appendChild(tempElt); } if ( spellsElt != null ) { result.appendChild(spellsElt); } 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 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); } } if ( e.hasAttribute("clones") ) { int clonesInd = indexOf ( clonesComboBox.getModel() , e.getAttribute("clones") ); if ( clonesInd >= 0 ) { clonesComboBox.setSelectedIndex(clonesInd); } } //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); 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); //HP, MP, maxHP, maxMP textfields tfHP.setText(e.getAttribute("hp")); tfMP.setText(e.getAttribute("mp")); tfMaxHP.setText(e.getAttribute("maxhp")); tfMaxMP.setText(e.getAttribute("maxmp")); //gender combo box if ( e.getAttribute("gender").equals("false") || e.getAttribute("gender").equals("0") ) genderComboBox.setSelectedIndex(1); else genderComboBox.setSelectedIndex(0); //skills panel NodeList traitsNl = e.getElementsByTagName("Traits"); Element traitsElt = (Element) traitsNl.item(0); if ( traitsElt != null ) { NodeList skillListNl = traitsElt.getElementsByTagName("SkillList"); sp.initFromXML(skillListNl.item(0)); } //TODO: initialize the cbPlayer. //already done for regular players, not for templates } }