package org.buzztroll.mud; import java.lang.*; import java.awt.*; import java.net.*; import java.io.*; import java.util.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; import javax.swing.colorchooser.*; import javax.swing.text.*; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; class ColorName extends JPanel { public Color color; public String name; public ColorName( String name, Color color) { super(); this.name = new String(name); this.color = color; this.setBackground(new Color(0, 0, 0)); this.setForeground(color); } public String toString() { return name; } } public class NameSetupPanel extends TransformPanel implements ChangeListener, ActionListener { protected JTextField newNameText; protected JList nameList; protected ColorPanel colorPanel; protected JButton addButton; protected JButton removeButton; protected DefaultListModel listModel; protected Vector nameVector; protected Hashtable nameLookup; protected Color toMeColor = Color.green; protected JButton toMeButton; protected JButton defaultButton; public NameSetupPanel() { super(); JPanel tempP; JPanel tempP2; JPanel tempP3; JPanel buttonPanel; defaultButton = new JButton("default"); defaultButton.addActionListener(this); defaultButton.setBackground(Color.lightGray); toMeButton = new JButton("To Me"); toMeButton.addActionListener(this); toMeButton.setBackground(toMeColor); addButton = new JButton("Add"); removeButton = new JButton("Remove"); newNameText = new JTextField(""); colorPanel = new ColorPanel(); nameLookup = new Hashtable(); nameVector = new Vector(); nameList = new JList(nameVector); // Or in two steps: JScrollPane scrollPane = new JScrollPane(); scrollPane.getViewport().setView(nameList); MyCellRenderer cr = new MyCellRenderer(); nameList.setCellRenderer(cr); newNameText.setBackground(new Color(0, 0, 0)); newNameText.setForeground(new Color(255, 255, 255)); nameList.setBackground(new Color(0, 0, 0)); nameList.setForeground(new Color(255, 255, 255)); tempP = new JPanel(); tempP.setLayout(new BorderLayout()); tempP.add("North", newNameText); tempP.add("Center", scrollPane); colorPanel = new ColorPanel(); buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(4, 1, 5, 5)); buttonPanel.add(new JPanel()); buttonPanel.add(addButton); buttonPanel.add(removeButton); tempP2 = new JPanel(); tempP2.setLayout(new BorderLayout(5, 5)); tempP2.add("Center", tempP); tempP2.add("East", buttonPanel); tempP3 = new JPanel(); tempP3.setLayout(new BorderLayout()); tempP3.add("Center", colorPanel); JPanel colorButtonPanel = new JPanel(); colorButtonPanel.setLayout(new GridLayout(2, 1)); colorButtonPanel.add(toMeButton); colorButtonPanel.add(defaultButton); tempP3.add("South", colorButtonPanel); tempP2.add("West", tempP3); this.setLayout(new BorderLayout()); this.add("Center", tempP2); addButton.addActionListener(this); removeButton.addActionListener(this); colorPanel.addChangeListener(this); newNameText.setForeground(colorPanel.getColor()); } public String getName() { return "Names"; } public Color getColor(String name) { ColorName cn = (ColorName) nameLookup.get(name); return (cn == null) ? Color.green : cn.color; } public Color getSelfColor() { return this.toMeColor; } // This mthid both creates the xml and adds values to the hastable public Node createDoc( Document doc) throws Exception { int ctr; Element namesE = doc.createElement("names"); nameLookup.clear(); for(ctr = 0; ctr < nameVector.size(); ctr++) { ColorName cn = (ColorName)nameVector.elementAt(ctr); Element characterE = doc.createElement("character"); // add to has table nameLookup.put(newNameText.getText(), cn); namesE.appendChild(characterE); characterE.setAttribute("name", cn.name); characterE.setAttribute("red", new Integer(cn.color.getRed()).toString()); characterE.setAttribute("green", new Integer(cn.color.getGreen()).toString()); characterE.setAttribute("blue", new Integer(cn.color.getBlue()).toString()); } Element toMeE = doc.createElement("toMe"); toMeE.setAttribute("red", new Integer(toMeColor.getRed()).toString()); toMeE.setAttribute("green", new Integer(toMeColor.getGreen()).toString()); toMeE.setAttribute("blue", new Integer(toMeColor.getBlue()).toString()); toMeButton.setBackground(toMeColor); namesE.appendChild(toMeE); Element dE = doc.createElement("default"); Color dC = defaultButton.getBackground(); dE.setAttribute("red", new Integer(dC.getRed()).toString()); dE.setAttribute("green", new Integer(dC.getGreen()).toString()); dE.setAttribute("blue", new Integer(dC.getBlue()).toString()); namesE.appendChild(dE); return namesE; } public void parse( Document doc) { int ctr; String connectionName = ""; Node n; Node nj; String name = ""; String redS = ""; String greenS = ""; String blueS = ""; System.out.println(doc); Element rootE = doc.getDocumentElement(); n = rootE.getFirstChild(); while(n != null) { if(Node.ELEMENT_NODE == n.getNodeType()) { Element e = (Element)n; /* get server name host port and auth */ if(e.getTagName().equals("names")) { nj = n.getFirstChild(); while(nj != null) { if(Node.ELEMENT_NODE == nj.getNodeType()) { Element ej = (Element)nj; if(ej.getTagName().equals("character")) { name = ej.getAttribute("name"); redS = ej.getAttribute("red"); greenS = ej.getAttribute("green"); blueS = ej.getAttribute("blue"); Color c = new Color( new Integer(redS).intValue(), new Integer(greenS).intValue(), new Integer(blueS).intValue()); ColorName cn = new ColorName( name, c); nameLookup.put(name, cn); nameVector.add(cn); } else if(ej.getTagName().equals("toMe")) { redS = ej.getAttribute("red"); greenS = ej.getAttribute("green"); blueS = ej.getAttribute("blue"); this.toMeColor = new Color( new Integer(redS).intValue(), new Integer(greenS).intValue(), new Integer(blueS).intValue()); this.toMeButton.setBackground(this.toMeColor); } else if(ej.getTagName().equals("default")) { redS = ej.getAttribute("red"); greenS = ej.getAttribute("green"); blueS = ej.getAttribute("blue"); Color c = new Color( new Integer(redS).intValue(), new Integer(greenS).intValue(), new Integer(blueS).intValue()); this.defaultButton.setBackground(c); } } nj = nj.getNextSibling(); } } } n = n.getNextSibling(); } } public DisplayMessage transform( DisplayMessage dmIn) { String name; String msg; DisplayMessage dm = dmIn; msg = dmIn.getString(); try { name = parseName(msg); if (name == null) { return new DisplayMessage(msg, defaultButton.getBackground(), dm.getFont()); } ColorName cn = (ColorName) nameLookup.get(name); if(cn != null) { dm = new DisplayMessage(msg, cn.color, dm.getFont()); } else if(msg.startsWith("(from ") || // this can be still optimized msg.indexOf("to you]:") == name.length() + 2) { dm = new DisplayMessage(msg, this.toMeColor, dm.getFont()); } else { dm = new DisplayMessage(msg, defaultButton.getBackground(), dm.getFont()); } } catch(Exception e) { System.err.println(msg); e.printStackTrace(); dm = dmIn; } return dm; } public static String parseName( String msg) { String name; if(msg.startsWith("(to")) { return "You"; } else if(msg.startsWith("(from ")) { name = msg.substring(msg.indexOf(")") + 1).trim(); name = name.substring(0, name.indexOf(" ")); return name.trim(); } else { int pos = msg.indexOf(" "); if (pos == -1) { return null; } else { return msg.substring(0, pos).trim(); } } } public void clear() { nameVector.clear(); nameLookup.clear(); } public void stateChanged( ChangeEvent e) { newNameText.setForeground(colorPanel.getColor()); } public void actionPerformed( ActionEvent e) { if(e.getSource() == addButton) { if(newNameText.getText().equals("")) { } ColorName cn = new ColorName(newNameText.getText(), colorPanel.getColor()); nameVector.add(cn); nameLookup.put(cn.toString(), cn); nameList.updateUI(); System.out.println(newNameText.getText() + " added."); } else if(e.getSource() == removeButton) { int ndx = nameList.getSelectedIndex(); ColorName cn = (ColorName) nameVector.elementAt(ndx); nameLookup.remove(cn.toString()); nameVector.removeElementAt(ndx); nameList.updateUI(); } else if(e.getSource() == toMeButton) { toMeColor = JColorChooser.showDialog(this, "Pick Color", toMeButton.getBackground()); toMeButton.setBackground(toMeColor); } else if(e.getSource() == defaultButton) { Color c = JColorChooser.showDialog(this, "Pick Color", defaultButton.getBackground()); defaultButton.setBackground(c); } } class MyCellRenderer extends JLabel implements ListCellRenderer { public Component getListCellRendererComponent( JList list, Object value, // value to display int index, // cell index boolean isSelected, // is the cell selected boolean cellHasFocus) // the list and the cell have the focus { ColorName cn = (ColorName)value; setText(cn.toString()); if(isSelected) { setBackground(list.getSelectionBackground()); } else { setBackground(list.getBackground()); } setForeground(cn.color); setEnabled(list.isEnabled()); setFont(list.getFont()); setOpaque(true); return this; } } }