summaryrefslogtreecommitdiff
path: root/NET/worlds/console/TradeDialog.java
diff options
context:
space:
mode:
Diffstat (limited to 'NET/worlds/console/TradeDialog.java')
-rw-r--r--NET/worlds/console/TradeDialog.java526
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;
+ }
+}