package NET.worlds.console; import NET.worlds.scape.InventoryItem; import NET.worlds.scape.InventoryManager; import NET.worlds.scape.Pilot; import java.awt.BorderLayout; import java.awt.Checkbox; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.Label; import java.awt.Panel; import java.awt.ScrollPane; import java.awt.TextField; import java.text.MessageFormat; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; public class TradeDialog extends WhisperDialog { private static final long serialVersionUID = -6745488915622839369L; public static final String tradeServerName = "TRADE"; private Checkbox confirmBox = new Checkbox(Console.message("Its-a-Deal")); ScrollPane scrollPane; private static Font font = new Font(Console.message("DialogFont"), 0, 12); private String lastOfferSent = ""; private String lastOfferReceived = ""; private Vector fieldList; private int keyChange; protected Panel hisOffer = new Panel(); protected Panel yourOffer = new Panel(); public TradeDialog(java.awt.Window parent, String partner) { super(parent, partner); } public static void sendTradeMessage(final String msg) { Main.register(new MainCallback() { @Override public void mainCallback() { Pilot.sendText("TRADE", msg); Main.unregister(this); } }); } public synchronized void setTrading(boolean f) { this.lastOfferReceived = ""; this.lastOfferSent = ""; this.isTrading = f; if (this.isTrading) { Object[] arguments = new Object[]{new String(this.partner)}; Console.println(MessageFormat.format(Console.message("Trade-with"), arguments)); } else { Object[] arguments = new Object[]{new String(this.partner)}; Console.println(MessageFormat.format(Console.message("Whisper-to-from"), arguments)); } if (this.built && !this.building) { this.building = true; Main.register(new MainCallback() { @Override public void mainCallback() { TradeDialog.this.build(); TradeDialog.this.pack(); Main.unregister(this); } }); } } @Override public boolean action(Event event, Object what) { Object target = event.target; if (target == this.confirmBox && this.confirmBox.getState()) { this.sendOffer(true, false); return true; } else { return false; } } @Override protected synchronized void activeCallback() { if (this.keyChange > 0 && --this.keyChange == 0) { this.sendOffer(false, true); } } private void displayOffer(String offerStr, Panel p) { InventoryManager im = InventoryManager.getInventoryManager(); Hashtable shorts = im.parseInventoryString(offerStr); p.removeAll(); GridBagConstraints c = new GridBagConstraints(); GridBagLayout gbag = new GridBagLayout(); p.setLayout(gbag); c.weightx = 1.0; c.weighty = 0.0; c.gridheight = 1; c.gridwidth = 0; c.insets = new Insets(6, 3, 0, 8); c.anchor = 17; if (shorts.size() == 0) { c.gridwidth = -1; c.insets = new Insets(36, 20, 36, 3); Label lab = new Label(Console.message("Nothing")); gbag.setConstraints(lab, c); p.add(lab); } if (shorts.size() > 0) { Enumeration shortEnum = shorts.elements(); while (shortEnum.hasMoreElements()) { InventoryItem invItem = shortEnum.nextElement(); c.gridwidth = -1; c.insets = new Insets(6, 3, 0, 8); ImageCanvas imcv = new ImageCanvas(invItem.getItemGraphicLocation()); gbag.setConstraints(imcv, c); p.add(imcv); c.gridwidth = 0; c.insets = new Insets(3, 3, 0, 3); Label lab = new Label(InventoryManager.getInventoryManager().itemName(invItem)); gbag.setConstraints(lab, c); p.add(lab); } } p.invalidate(); p.doLayout(); p.validate(); p.repaint(); Container par = p.getParent(); if (par != null) { par.invalidate(); par.doLayout(); par.validate(); par.repaint(); } } private synchronized void clearOffer() { int len = this.fieldList.size(); for (int i = 0; i < len; i++) { TextField tf = this.fieldList.elementAt(i); tf.setFont(font); tf.setText(""); } } private synchronized void sendOffer(boolean isDeal, boolean onlyIfChanged) { String offer = ""; InventoryManager im = InventoryManager.getInventoryManager(); Hashtable invHash = im.getInventoryItems(); if (invHash.size() > 0) { Enumeration invEnum = invHash.elements(); for (int i = 0; invEnum.hasMoreElements(); i++) { InventoryItem invItem = invEnum.nextElement(); TextField tf = this.fieldList.elementAt(i); tf.setFont(font); String nm = invItem.getItemId(); int count = -1; if (tf.getText().trim().length() == 0) { count = 0; } else { try { count = Integer.parseInt(tf.getText()); } catch (NumberFormatException var13) { } } int maxCount = invItem.getItemQuantity(); if (count < 0 || count > maxCount) { this.whisperPart.println("*** Invalid number of " + InventoryManager.getInventoryManager().getPlural(nm) + ": " + tf.getText() + "."); return; } if (count > 0) { offer = offer + nm; if (count > 1) { offer = offer + Integer.toString(count); } } } } String ourPartOfOffer = offer; if (isDeal) { int commaPos = this.lastOfferReceived.indexOf(","); if (commaPos < 0 || !offer.equals(this.lastOfferReceived.substring(commaPos + 1))) { Object[] arguments = new Object[]{new String(this.partner)}; this.whisperPart.println(MessageFormat.format(Console.message("proposed-deal"), arguments)); if (commaPos < 0) { commaPos = this.lastOfferReceived.length(); if (this.lastOfferReceived.equals("cancel")) { commaPos = 0; } } } String newOffer = this.lastOfferReceived.substring(0, commaPos) + "," + offer; this.lastOfferSent = newOffer; offer = offer + "," + this.lastOfferReceived.substring(0, commaPos); } else { String lastSent = this.lastOfferSent; int commaPos = lastSent.indexOf(","); if (onlyIfChanged && offer.equals(lastSent.substring(commaPos + 1))) { return; } this.lastOfferSent = offer; } this.displayOffer(ourPartOfOffer, this.yourOffer); this.whisperPart.say("&|+trade>" + offer); if (isDeal) { sendTradeMessage("&|+deal>" + this.whisperPart.getPartner() + " " + offer); } } public static String buildInvDesc(Hashtable inv) { String str = ""; Enumeration invEnum = inv.elements(); InventoryManager im = InventoryManager.getInventoryManager(); if (invEnum.hasMoreElements()) { Object obj = invEnum.nextElement(); if (obj != null) { InventoryItem invItem = (InventoryItem)obj; str = str + im.itemName(invItem); } while (invEnum.hasMoreElements()) { obj = invEnum.nextElement(); InventoryItem invItem = (InventoryItem)obj; str = str + ", "; str = str + im.itemName(invItem); } } return str; } protected void cancelTrading() { if (this.isTrading && this.isActive()) { this.whisperPart.say("&|+trade>cancel"); if (this.lastOfferSent.indexOf(",") >= 0) { sendTradeMessage("&|+deal>cancel"); } this.lastOfferSent = ""; } } @Override protected synchronized boolean done(boolean confirmed) { this.cancelTrading(); WhisperManager.whisperManager().remove(this.partner); return super.done(confirmed); } protected void doneDeal() { String tradeTerms = ""; InventoryManager im = InventoryManager.getInventoryManager(); int commaPos = this.lastOfferSent.indexOf(","); if (commaPos >= 0) { Hashtable lost = im.parseInventoryString(this.lastOfferSent.substring(commaPos + 1)); tradeTerms = buildInvDesc(lost); if (tradeTerms.length() == 0) { tradeTerms = "nothing"; } Hashtable got = im.parseInventoryString(this.lastOfferSent.substring(0, commaPos)); String gotTerms = buildInvDesc(got); if (gotTerms.length() == 0) { gotTerms = "nothing"; } tradeTerms = ": " + tradeTerms + " for " + gotTerms; this.setTrading(true); Object[] arguments = new Object[]{new String(tradeTerms)}; this.whisperPart.println(MessageFormat.format(Console.message("Trans-complete"), arguments)); } } protected void processOffer(boolean startUp) { if (this.lastOfferReceived.equals("cancel")) { this.lastOfferReceived = ""; this.cancelTrading(); this.setTrading(true); Object[] arguments = new Object[]{new String(this.partner)}; this.whisperPart.println(MessageFormat.format(Console.message("Trans-complete"), arguments)); } else { String offer = this.lastOfferReceived; int lastComma = 0; int commaPos = offer.indexOf(","); Object[] arguments = new Object[]{new String(this.partner)}; if (commaPos < 0) { if (!startUp) { this.whisperPart.println(MessageFormat.format(Console.message("offer-changed"), arguments)); } } else if (!offer.equals(this.lastOfferSent)) { lastComma = this.lastOfferSent.indexOf(","); if (lastComma < 0) { lastComma = this.lastOfferSent.length(); } if (offer.substring(commaPos + 1).equals(this.lastOfferSent.substring(0, lastComma))) { this.whisperPart.println(MessageFormat.format(Console.message("proposed-this"), arguments)); } else { this.whisperPart.println(MessageFormat.format(Console.message("proposed-new"), arguments)); } } if (commaPos < 0) { commaPos = offer.length(); } this.displayOffer(offer.substring(0, commaPos), this.hisOffer); } } @Override protected synchronized void build() { if (this.lastOfferSent.equals("")) { this.displayOffer("", this.yourOffer); } if (this.lastOfferReceived.equals("") || this.lastOfferReceived.equals("cancel")) { this.displayOffer("", this.hisOffer); } this.building = false; if (this.built) { this.removeAll(); } this.built = true; Color bg1 = new Color(0, 0, 0); Color bg2 = new Color(0, 192, 192); Color bg2b = new Color(0, 160, 160); Color fg1 = new Color(255, 255, 255); this.setBackground(this.isTrading ? bg1 : Color.white); this.setForeground(Color.black); Panel borderPanel = null; if (this.isTrading) { borderPanel = new InsetPanel(new BorderLayout(), 6, 10, 12, 11); borderPanel.setBackground(bg1); InventoryManager iMgr = InventoryManager.getInventoryManager(); Hashtable inv = iMgr.getInventoryItems(); Enumeration invEnum = inv.elements(); int len = inv.size(); this.fieldList = new Vector(len); Panel yourInv = new Panel(new GridLayout(1, len == 0 ? 1 : len)); yourInv.setBackground(bg2); int i = 0; if (inv.size() > 0) { while (invEnum.hasMoreElements()) { InventoryItem invItem = invEnum.nextElement(); Panel p = new Panel(new BorderLayout()); p.setFont(font); p.setBackground((i & 1) == 1 ? bg2 : bg2b); MultiLineLabel nm = new MultiLineLabel(iMgr.itemName(invItem), 3, 0); p.add("North", nm); ImageCanvas im = new ImageCanvas(invItem.getItemGraphicLocation()); Panel ins = new InsetPanel(new BorderLayout(), 5, 15, 5, 15); ins.add("Center", im); ins.setBackground((i & 1) == 1 ? bg2 : bg2b); p.add("Center", ins); Panel p2 = new Panel(new BorderLayout()); p2.setFont(font); TextField tf = new TextField("", 1); tf.setFocusable(true); tf.setFont(font); this.fieldList.addElement(tf); p2.add("West", tf); nm = new MultiLineLabel("of " + invItem.getItemQuantity(), 3, 0); p2.add("Center", nm); p2.add("South", new FixedSizePanel(5, 25)); p.add("South", p2); yourInv.add(p); i++; } } else { Label nm = new Label(Console.message("You-have-nothing")); yourInv.add(nm); } this.scrollPane = new WideScrollPane(yourInv, true); this.scrollPane.setBackground(bg2); Panel invLabelPanel = new Panel(new BorderLayout()); invLabelPanel.setFont(font); Label invLabel = new Label(Console.message("Your-inventory")); invLabel.setBackground(bg1); invLabel.setForeground(fg1); invLabelPanel.add("North", invLabel); invLabelPanel.add("Center", this.scrollPane); borderPanel.add("North", invLabelPanel); Panel offers = new Panel(new GridLayout(1, 2)); this.scrollPane = new WideScrollPane(this.yourOffer, true); this.scrollPane.setBackground(bg2); Panel labeledYour = new InsetPanel(new BorderLayout(), 0, 0, 8, 9); Label labelYour = new Label(Console.message("Your-offer")); labelYour.setBackground(bg1); labelYour.setForeground(fg1); labeledYour.add("North", labelYour); labeledYour.add("Center", this.scrollPane); offers.add(labeledYour); this.scrollPane = new WideScrollPane(this.hisOffer, true); this.scrollPane.setBackground(bg2); Panel labeledHis = new InsetPanel(new BorderLayout(), 0, 9, 8, 0); Object[] arguments = new Object[]{new String(this.partner)}; Label labelHis = new Label(MessageFormat.format(Console.message("partner-offer"), arguments)); labelHis.setBackground(bg1); labelHis.setForeground(fg1); labeledHis.add("North", labelHis); labeledHis.add("Center", this.scrollPane); offers.add(labeledHis); Panel insDeal = new InsetPanel(new BorderLayout(), 8, 18, 8, 18); insDeal.setBackground(bg1); insDeal.add("Center", offers); insDeal.add("South", this.confirmBox); borderPanel.add("Center", insDeal); this.processOffer(true); } this.whisperPart.line.setBackground(this.isTrading ? bg2 : Color.white); if (this.isTrading) { if (!this.isBroadcast) { Panel listenPane = new Panel(new BorderLayout()); this.whisperPart.listen.setBackground(bg2); Object[] arguments = new Object[]{new String(this.partner)}; Label whispLabel = new Label(MessageFormat.format(Console.message("Whispers-with"), arguments)); whispLabel.setBackground(bg1); whispLabel.setForeground(fg1); listenPane.add("North", whispLabel); listenPane.add("Center", this.whisperPart.listen.getComponent()); listenPane.add("South", this.whisperPart.line); borderPanel.add("South", listenPane); } else { borderPanel.add("South", this.whisperPart.line); } this.add(borderPanel); } else { this.whisperPart.listen.setBackground(Color.lightGray); Panel insListen = new InsetPanel(new BorderLayout(), 3, 1, 1, 1); insListen.setBackground(Color.lightGray); insListen.add("Center", this.whisperPart.listen.getComponent()); this.add("Center", insListen); Panel insLine = new InsetPanel(new BorderLayout(), 2, 1, 2, 1); insLine.setBackground(Color.lightGray); insLine.add("Center", this.whisperPart.line); this.add("South", insLine); } this.validate(); } @Override protected synchronized void print(String msg) { if (msg.startsWith("&|+trade>")) { if (!this.isTrading) { this.setTrading(true); } this.lastOfferReceived = msg.substring(9); if (!this.building) { this.processOffer(false); } } else if (!msg.startsWith("&|+")) { this.whisperPart.println("> " + msg); } } @Override public synchronized boolean keyDown(Event event, int key) { if (!this.isTrading) { this.whisperPart.line.requestFocus(); } else { this.keyChange = 2; } if (key == 10) { this.whisperPart.trigger(); return true; } else { return false; } } @Override public Dimension preferredSize() { Dimension d = super.preferredSize(); if (d.width < 400) { d.width = 400; } if (d.height < 400) { d.height = 400; } return d; } @Override public Dimension minimumSize() { Dimension d = super.minimumSize(); if (d.width < 400) { d.width = 400; } if (d.height < 400) { d.height = 400; } return d; } }