diff options
Diffstat (limited to 'NET/worlds/console/TradeDialog.java')
| -rw-r--r-- | NET/worlds/console/TradeDialog.java | 526 |
1 files changed, 526 insertions, 0 deletions
diff --git a/NET/worlds/console/TradeDialog.java b/NET/worlds/console/TradeDialog.java new file mode 100644 index 0000000..44dbdf2 --- /dev/null +++ b/NET/worlds/console/TradeDialog.java @@ -0,0 +1,526 @@ +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<TextField> 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<String, InventoryItem> 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<InventoryItem> 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<String, InventoryItem> invHash = im.getInventoryItems(); + if (invHash.size() > 0) { + Enumeration<InventoryItem> 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<String, InventoryItem> inv) { + String str = ""; + Enumeration<InventoryItem> 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<String, InventoryItem> lost = im.parseInventoryString(this.lastOfferSent.substring(commaPos + 1)); + tradeTerms = buildInvDesc(lost); + if (tradeTerms.length() == 0) { + tradeTerms = "nothing"; + } + + Hashtable<String, InventoryItem> 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<String, InventoryItem> inv = iMgr.getInventoryItems(); + Enumeration<InventoryItem> invEnum = inv.elements(); + int len = inv.size(); + this.fieldList = new Vector<TextField>(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; + } +} |