/* * (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.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; import javax.swing.BoxLayout; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListModel; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.JTextField; import org.f2o.absurdum.puck.gui.graph.Arrow; import org.f2o.absurdum.puck.gui.graph.ItemNode; import org.f2o.absurdum.puck.gui.graph.Node; import org.f2o.absurdum.puck.gui.graph.StructuralArrow; 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.NodeList; import eu.irreality.age.windowing.TabUtils; /** * @author carlos * * Created at regulus, 20-jul-2005 18:51:54 */ public class PathPanel extends ArrowPanel { //private JTextField nameTextField = new EnhancedJTextField(20); //private JComboBox extendsComboBox = new JComboBox(); /* private JComboBox srcComboBox = new JComboBox(); private JComboBox dstComboBox = new JComboBox(); */ private JComboBox dirComboBox; private JComboBox doorComboBox = new JComboBox(); private JTextField lengthTextField = new EnhancedJTextField("0",5); //private Arrow pathArrow; /* private Vector roomNodes; private Vector itemNodes; //used for paths with doors */ private ItemNode door; private DescriptionListPanel dlp; private PathCommandsPanel pcp; private PropertiesPanel pp; public void setDoor ( ItemNode door ) { this.door = door; } public ItemNode getDoor ( ) { return door; } public String getDirectionString() { return (String) dirComboBox.getSelectedItem(); } public Vector getPossibleSourceNodes() { return this.getGraphEditingPanel().getRoomNodes(false); } public Vector getPossibleDestinationNodes() { return this.getGraphEditingPanel().getRoomNodes(false); } public String getNameForElement() { String result; if ( !getDirectionString().equals(UIMessages.getInstance().getMessage("dir.none")) ) result = getDirectionString(); else result = ""; if ( pcp != null ) //will be null if panel not fully initted (just minimally initted) { DefaultListModel dlm = pcp.getListModel(); if ( dlm.size() > 0 ) { result += " (" + dlm.get(0); if ( dlm.size() > 1 ) { result += ", ...)"; } else result += ")"; } } return result; } public PathPanel( Arrow pathArrow ) { super(pathArrow); setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); // possible structural relationship types relTypes.clear(); relTypes.add(UIMessages.getInstance().getMessage("structural.room.room")); relTypes.add(ArrowPanel.NO_STRUCTURAL_RELATIONSHIP); //default structural relationship type this.relationshipType = UIMessages.getInstance().getMessage("structural.room.room"); //default relationship is this one (path) add(new JLabel("Path")); } public String toString() { return "Yet Another Path Panel " + describeArrow(); } public String getPanelName() { return "Yet Another Path Panel"; } //initialise the minimum to be able to access name, etc. in the graph display public void doInitMinimal() { super.doInitMinimal(); //std. direction Vector directions = new Vector(); directions.add(UIMessages.getInstance().getMessage("dir.none")); directions.add(UIMessages.getInstance().getMessage("dir.n")); directions.add(UIMessages.getInstance().getMessage("dir.s")); directions.add(UIMessages.getInstance().getMessage("dir.e")); directions.add(UIMessages.getInstance().getMessage("dir.w")); directions.add(UIMessages.getInstance().getMessage("dir.u")); directions.add(UIMessages.getInstance().getMessage("dir.d")); directions.add(UIMessages.getInstance().getMessage("dir.nw")); directions.add(UIMessages.getInstance().getMessage("dir.sw")); directions.add(UIMessages.getInstance().getMessage("dir.ne")); directions.add(UIMessages.getInstance().getMessage("dir.se")); dirComboBox = new JComboBox ( new DefaultComboBoxModel ( directions ) ); dirComboBox.setSelectedItem( ((StructuralArrow)theArrow).getMostLikelyDirection() ); } public void linkWithGraph() { super.linkWithGraph(); //this does a removeAll(). /* roomNodes = this.getGraphEditingPanel().getRoomNodes(); srcComboBox = new JComboBox ( new DefaultComboBoxModel ( roomNodes ) ); dstComboBox = new JComboBox ( new DefaultComboBoxModel ( roomNodes ) ); srcComboBox.setSelectedIndex( indexOf(roomNodes,pathArrow.getSource().getName()) ); dstComboBox.setSelectedIndex( indexOf(roomNodes,pathArrow.getDestination().getName()) ); */ Vector itemNodes = this.getGraphEditingPanel().getItemNodes(true); doorComboBox = new JComboBox ( new DefaultComboBoxModel ( itemNodes ) ); if ( door != null ) doorComboBox.setSelectedIndex( indexOf(itemNodes,door.getName()) ); else doorComboBox.setSelectedIndex(0); //listener just to update the door attribute when door combo box selection //changes, so that this change is immediately reflected on the graph doorComboBox.addActionListener( new ActionListener() { public void actionPerformed ( ActionEvent evt ) { if ( doorComboBox.getSelectedIndex() >= 0 ) { int index = dstComboBox.getSelectedIndex(); if ( doorComboBox.getSelectedItem() instanceof ItemNode ) //user has selected an item door = (ItemNode) doorComboBox.getSelectedItem(); else //user has selected the "none" option, which is a String and not an ItemNode door = null; } } }); JPanel mainTab = new JPanel(); mainTab.setLayout(new BoxLayout(mainTab,BoxLayout.PAGE_AXIS)); JPanel srcPanel = new JPanel(); srcPanel.add ( new JLabel(UIMessages.getInstance().getMessage("path.src")) ); srcPanel.add ( srcComboBox ); mainTab.add(srcPanel); JPanel dstPanel = new JPanel(); dstPanel.add ( new JLabel(UIMessages.getInstance().getMessage("path.dst")) ); dstPanel.add ( dstComboBox ); mainTab.add(dstPanel); JPanel enablePathPanel = new JPanel(); final JCheckBox enablePathCb = new JCheckBox(UIMessages.getInstance().getMessage("path.enable")); enablePathPanel.add(enablePathCb); mainTab.add(enablePathPanel); if ( relationshipType.equals ( ArrowPanel.NO_STRUCTURAL_RELATIONSHIP ) ) enablePathCb.setSelected(false); else enablePathCb.setSelected(true); enablePathCb.addActionListener ( new ActionListener() { public void actionPerformed ( ActionEvent evt ) { if ( enablePathCb.isSelected() ) relationshipType = UIMessages.getInstance().getMessage("structural.room.room"); else relationshipType = ArrowPanel.NO_STRUCTURAL_RELATIONSHIP; } }); //setVisible(true); //initMinimal(); //direction //already done, not needed JPanel dirPanel = new JPanel(); dirPanel.add ( new JLabel(UIMessages.getInstance().getMessage("path.dir")) ); dirPanel.add ( dirComboBox ); mainTab.add(dirPanel); JPanel doorPanel = new JPanel(); doorPanel.add( new JLabel(UIMessages.getInstance().getMessage("path.door")) ); doorPanel.add( doorComboBox ); mainTab.add (doorPanel); JPanel lengthPanel = new JPanel(); lengthPanel.add( new JLabel(UIMessages.getInstance().getMessage("path.length")) ); lengthPanel.add( lengthTextField ); mainTab.add ( lengthPanel ); //commands pcp = new PathCommandsPanel(); mainTab.add(pcp); //descriptions dlp = new DescriptionListPanel(); mainTab.add(dlp); //properties pp = new PropertiesPanel(); mainTab.add(pp); //setVisible(true); jtp.add(mainTab,UIMessages.getInstance().getMessage("tab.structrel"),0); jtp.setSelectedIndex(0); TabUtils.setDefaultMnemonics(jtp); } public void refresh() { super.refresh(); Vector itemNodes = this.getGraphEditingPanel().getItemNodes(true); doorComboBox.setModel(new DefaultComboBoxModel ( itemNodes ) ); if ( door != null ) doorComboBox.setSelectedIndex( indexOf(itemNodes,door.getName()) ); else doorComboBox.setSelectedIndex(0); } public org.w3c.dom.Node doGetXML ( Document d ) { Element result = d.createElement("Path"); result.setAttribute("destination",dstComboBox.getSelectedItem().toString()); if ( !dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("none")) ) { result.setAttribute("standard","true"); String directionString = "???"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.n")) ) directionString="norte"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.s")) ) directionString="sur"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.e")) ) directionString="este"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.w")) ) directionString="oeste"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.n")) ) directionString="norte"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.nw")) ) directionString="noroeste"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.sw")) ) directionString="suroeste"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.ne")) ) directionString="nordeste"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.se")) ) directionString="sudeste"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.u")) ) directionString="arriba"; if ( dirComboBox.getSelectedItem().equals(UIMessages.getInstance().getMessage("dir.d")) ) directionString="abajo"; result.setAttribute("direction",directionString); } //path length (exit time) if ( lengthTextField.getText().length() > 0 ) result.setAttribute("exitTime",lengthTextField.getText()); //door (associated item) if ( doorComboBox.getSelectedIndex() > 0 ) //0 = "nada" { this.door = (ItemNode) doorComboBox.getSelectedItem(); String doorStr = this.door.toString(); Element e = d.createElement("AssociatedItem"); e.setAttribute("id",doorStr); result.appendChild(e); } result.appendChild(pp.getXML(d)); result.appendChild(dlp.getXML(d)); result.appendChild(pcp.getXML(d)); return result; } //from Path node public void doInitFromXML ( org.w3c.dom.Node n ) { linkWithGraph(); refresh(); //this should already fix the combo box values alright //if the arrow was created correctly between the corresponding nodes Element e = (Element) n; if ( e.getTagName().equals("Relationship") ) return; //we're not initting the path //direction combo box init if ( e.getAttribute("standard").equals("true") ) { String dirAttr = e.getAttribute("direction"); if ( "norte".equals(dirAttr) ) dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("dir.n")); else if ( "sur".equals(dirAttr) ) dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("dir.s")); else if ( "este".equals(dirAttr) ) dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("dir.e")); else if ( "oeste".equals(dirAttr) ) dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("dir.w")); else if ( "noroeste".equals(dirAttr) ) dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("dir.nw")); else if ( "suroeste".equals(dirAttr) ) dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("dir.sw")); else if ( "nordeste".equals(dirAttr) ) dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("dir.ne")); else if ( "sudeste".equals(dirAttr) ) dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("dir.se")); else if ( "arriba".equals(dirAttr) ) dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("dir.u")); else if ( "abajo".equals(dirAttr) ) dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("dir.d")); } else { dirComboBox.setSelectedItem(UIMessages.getInstance().getMessage("none")); } //description list panel init NodeList desNl = e.getElementsByTagName("DescriptionList"); Element desListElt = (Element) desNl.item(0); dlp.initFromXML(desListElt); //path commands panel init pcp.initFromXML(e); //properties panel init NodeList plNl = e.getElementsByTagName("PropertyList"); Element plElt = (Element) plNl.item(0); if ( plElt != null ) pp.initFromXML(plElt); //length text field lengthTextField.setText(e.getAttribute("exitTime")); //set default length if not present if ( lengthTextField.getText().trim().length() <= 0 ) lengthTextField.setText("0"); } }