/* * (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.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 SpellPanel extends EntityPanel implements BeanShellCodeHolder { private JComboBox extendsComboBox = new JComboBox(); private JComboBox clonesComboBox = new JComboBox(); /* private JComboBox genderComboBox = new JComboBox(); private JTextField tfWeight = new EnhancedJTextField("0",5); private JTextField tfVolume = new EnhancedJTextField("0",5); */ /* private JCheckBox containerBox = new JCheckBox(Messages.getInstance().getMessage("checkbox.container")); */ private JTextField tfCastProbSteepness = new EnhancedJTextField("0",5); private JTextField tfCastTimeStarting = new EnhancedJTextField("0",5); private JTextField tfCastTimeSteepness = new EnhancedJTextField("0",5); private JTextField tfDurationStarting = new EnhancedJTextField("0",5); private JTextField tfDurationSteepness = new EnhancedJTextField("0",5); private JTextField tfManaCostStarting = new EnhancedJTextField("0",5); private JTextField tfManaCostSteepness = new EnhancedJTextField("0",5); private JTextField tfIntensityStarting = new EnhancedJTextField("0",5); private JTextField tfIntensitySteepness = new EnhancedJTextField("0",5); private PathCommandsPanel involvedSkillsPanel; //involved skill //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 org.f2o.absurdum.puck.gui.graph.Node node; public SpellPanel( org.f2o.absurdum.puck.gui.graph.Node node ) { super(); nameTextField.setText("Spell #"+getID()); this.node = node; //add ( extendsComboBox ); } public String toString() { return nameTextField.getText() + "##" + super.toString(); } public String getPanelName() { return nameTextField.getText(); } 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 spellNodes = this.getGraphEditingPanel().getNodes(SpellNode.class,true); extendsComboBox = new JComboBox ( new DefaultComboBoxModel ( spellNodes ) ); clonesComboBox = new JComboBox ( new DefaultComboBoxModel ( spellNodes ) ); 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 castProbPanel = new JPanel(); castProbPanel.add(new JLabel(UIMessages.getInstance().getMessage("spell.castprob.steepness"))); castProbPanel.add(tfCastProbSteepness); firstTab.add(castProbPanel); JPanel castTimePanel = new JPanel(); castTimePanel.setBorder(BorderFactory.createTitledBorder(UIMessages.getInstance().getMessage("spell.casttime"))); castTimePanel.add(new JLabel(UIMessages.getInstance().getMessage("spell.casttime.starting"))); castTimePanel.add(tfCastTimeStarting); castTimePanel.add(new JLabel(UIMessages.getInstance().getMessage("spell.casttime.steepness"))); castTimePanel.add(tfCastTimeSteepness); firstTab.add(castTimePanel); JPanel durationPanel = new JPanel(); durationPanel.setBorder(BorderFactory.createTitledBorder(UIMessages.getInstance().getMessage("spell.duration"))); durationPanel.add(new JLabel(UIMessages.getInstance().getMessage("spell.duration.starting"))); durationPanel.add(tfDurationStarting); durationPanel.add(new JLabel(UIMessages.getInstance().getMessage("spell.duration.steepness"))); durationPanel.add(tfDurationSteepness); firstTab.add(durationPanel); JPanel manaCostPanel = new JPanel(); manaCostPanel.setBorder(BorderFactory.createTitledBorder(UIMessages.getInstance().getMessage("spell.manacost"))); manaCostPanel.add(new JLabel(UIMessages.getInstance().getMessage("spell.manacost.starting"))); manaCostPanel.add(tfManaCostStarting); manaCostPanel.add(new JLabel(UIMessages.getInstance().getMessage("spell.manacost.steepness"))); manaCostPanel.add(tfManaCostSteepness); firstTab.add(manaCostPanel); JPanel intensityPanel = new JPanel(); intensityPanel.setBorder(BorderFactory.createTitledBorder(UIMessages.getInstance().getMessage("spell.intensity"))); intensityPanel.add(new JLabel(UIMessages.getInstance().getMessage("spell.intensity.starting"))); intensityPanel.add(tfIntensityStarting); intensityPanel.add(new JLabel(UIMessages.getInstance().getMessage("spell.intensity.steepness"))); intensityPanel.add(tfIntensitySteepness); firstTab.add(intensityPanel); involvedSkillsPanel = new PathCommandsPanel(UIMessages.getInstance().getMessage("spell.involvedskills"),UIMessages.getInstance().getMessage("label.skill"),true); firstTab.add(involvedSkillsPanel); /* 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); */ /** * TODO Note: * As of 2008-04-19, spells in AGE don't have reference names. * But they should be implemented in the future, so I leave this panel here for when this functionality is added to AGE. */ 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("spell",this); = BSHCodePanelFactory.getInstance().createPanel("spell",this); secondTab.add(bcp); pp = new PropertiesPanel(); secondTab.add(pp); jtp.add(UIMessages.getInstance().getMessage("tab.codeprop"),secondTab); TabUtils.setDefaultMnemonics(jtp); //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); */ } public Node doGetXML ( Document d ) { Element result = d.createElement("Spell"); result.setAttribute("name",this.getPanelName()); /* 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())); */ result.appendChild(involvedSkillsPanel.getXML(d,"InvolvedSkills","Skill","name")); Element castProbElt = d.createElement("CastProbability"); castProbElt.setAttribute("steepness",tfCastProbSteepness.getText()); Element castTimeElt = d.createElement("CastTime"); castTimeElt.setAttribute("starting",tfCastTimeStarting.getText()); castTimeElt.setAttribute("steepness",tfCastTimeSteepness.getText()); Element durationElt = d.createElement("Duration"); durationElt.setAttribute("starting",tfDurationStarting.getText()); durationElt.setAttribute("steepness",tfDurationSteepness.getText()); Element manaCostElt = d.createElement("ManaCost"); manaCostElt.setAttribute("starting",tfManaCostStarting.getText()); manaCostElt.setAttribute("steepness",tfManaCostSteepness.getText()); Element intensityElt = d.createElement("Intensity"); intensityElt.setAttribute("starting",tfIntensityStarting.getText()); intensityElt.setAttribute("steepness",tfIntensitySteepness.getText()); result.appendChild(castProbElt); result.appendChild(castTimeElt); result.appendChild(durationElt); result.appendChild(manaCostElt); result.appendChild(intensityElt); //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(); //effects: Element effList = null; //if ( containerBox.isSelected() ) effList = d.createElement("EffectList"); /* Element partsElt = null; Element keysElt = null; */ for ( int i = 0 ; i < arrows.size() ; i++ ) { GraphElementPanel gep = ((Arrow)arrows.get(i)).getAssociatedPanel(); //TODO EffectList stuff if ( gep instanceof SpellHasEffectPanel ) { SpellHasEffectPanel relPanel = (SpellHasEffectPanel) gep; String relType = relPanel.getRelationshipType(); if ( relType.equals(UIMessages.getInstance().getMessage("structural.spell.abstractentity.haseffect")) ) //has-effect relationship { effList.appendChild( relPanel.getXML(d) ); } } } Element relationshipsElt = (Element) getCustomRelationshipListXML ( d , node ); if ( effList != null ) result.appendChild(effList); 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); } } //cast probability NodeList castProbNl = e.getElementsByTagName("CastProbability"); if ( castProbNl.getLength() > 0 ) { Element castProbElt = (Element) castProbNl.item(0); tfCastProbSteepness.setText(castProbElt.getAttribute("steepness")); } //cast time NodeList castTimeNl = e.getElementsByTagName("CastTime"); if ( castTimeNl.getLength() > 0 ) { Element castTimeElt = (Element) castTimeNl.item(0); tfCastTimeStarting.setText(castTimeElt.getAttribute("starting")); tfCastTimeSteepness.setText(castTimeElt.getAttribute("steepness")); } //duration NodeList durationNl = e.getElementsByTagName("Duration"); if ( durationNl.getLength() > 0 ) { Element durationElt = (Element) durationNl.item(0); tfDurationStarting.setText(durationElt.getAttribute("starting")); tfDurationSteepness.setText(durationElt.getAttribute("steepness")); } //mana cost NodeList manaCostNl = e.getElementsByTagName("ManaCost"); if ( manaCostNl.getLength() > 0 ) { Element manaCostElt = (Element) manaCostNl.item(0); tfManaCostStarting.setText(manaCostElt.getAttribute("starting")); tfManaCostSteepness.setText(manaCostElt.getAttribute("steepness")); } //intensity NodeList intensityNl = e.getElementsByTagName("Intensity"); if ( intensityNl.getLength() > 0 ) { Element intensityElt = (Element) intensityNl.item(0); tfIntensityStarting.setText(intensityElt.getAttribute("starting")); tfIntensitySteepness.setText(intensityElt.getAttribute("steepness")); } //involved skills NodeList skillsNl = e.getElementsByTagName("InvolvedSkills"); if ( skillsNl.getLength() > 0 ) { Element skillsElt = (Element) skillsNl.item(0); involvedSkillsPanel.initFromXML(skillsElt,"Skill","name"); } //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); if ( srnListElt != null ) srn.initFromXML(srnListElt); //plural ref names panel NodeList prnNl = e.getElementsByTagName("PluralReferenceNames"); Element prnListElt = (Element) prnNl.item(0); if ( srnListElt != null ) prn.initFromXML(prnListElt); //set default values for text fields if they are empty setDefaultTextIfEmpty ( tfCastProbSteepness , "0" ); setDefaultTextIfEmpty ( tfCastTimeStarting , "10" ); setDefaultTextIfEmpty ( tfCastTimeSteepness , "0" ); setDefaultTextIfEmpty ( tfManaCostStarting , "10" ); setDefaultTextIfEmpty ( tfManaCostSteepness , "0" ); setDefaultTextIfEmpty ( tfIntensityStarting , "10" ); setDefaultTextIfEmpty ( tfIntensitySteepness , "0" ); setDefaultTextIfEmpty ( tfDurationStarting , "300" ); setDefaultTextIfEmpty ( tfDurationSteepness , "0" ); } private void setDefaultTextIfEmpty ( JTextField textField , String value ) { if ( textField.getText().trim().length() <= 0 ) textField.setText(value); } public String getBSHCode() { if ( bcp == null ) forceRealInitFromXml(true); //code panel not yet initted. return bcp.getCode(); } }