|
From: Erik V. <ev...@us...> - 2011-11-16 22:07:23
|
rails/game/model/ShareModel.java | 33 +++++++++++++++++++++++++++++++--
rails/ui/swing/GameStatus.java | 25 +++++++++++++++++++++++--
rails/ui/swing/elements/Field.java | 29 +++++++++++++++++++++++++++--
3 files changed, 81 insertions(+), 6 deletions(-)
New commits:
commit 902cac06c959dc53ef89aec36cdedb9db2cce2ac
Author: Erik Vos <eri...@xs...>
Date: Wed Nov 16 23:05:48 2011 +0100
Added tooltips to Game Status share fields to display portfolio composition.
diff --git a/rails/game/model/ShareModel.java b/rails/game/model/ShareModel.java
index d38691b..2dd9993 100644
--- a/rails/game/model/ShareModel.java
+++ b/rails/game/model/ShareModel.java
@@ -1,6 +1,8 @@
/* $Header: /Users/blentz/rails_rcs/cvs/18xx/rails/game/model/ShareModel.java,v 1.8 2009/10/06 18:34:04 evos Exp $*/
package rails.game.model;
+import java.util.*;
+
import rails.game.*;
public class ShareModel extends ModelObject {
@@ -9,6 +11,8 @@ public class ShareModel extends ModelObject {
private Portfolio portfolio;
private PublicCompanyI company;
+ public static final String SHARES = "SHARES";
+
public ShareModel(Portfolio portfolio, PublicCompanyI company) {
this.portfolio = portfolio;
this.company = company;
@@ -32,12 +36,37 @@ public class ShareModel extends ModelObject {
}
@Override
+ public Object getUpdate() {
+ ViewUpdate u = new ViewUpdate (getText());
+ List<PublicCertificateI> certs = portfolio.getCertificatesPerCompany(company.getName());
+ if (certs != null) {
+ Map<String, Integer> numberPerCertType = new HashMap<String, Integer>();
+ String certType;
+ for (PublicCertificateI cert : certs) {
+ certType = cert.getTypeId();
+ if (!numberPerCertType.containsKey(certType)) {
+ numberPerCertType.put(certType, 1);
+ } else {
+ numberPerCertType.put(certType, numberPerCertType.get(certType)+1);
+ }
+ }
+ StringBuilder b = new StringBuilder();
+ for (String type : numberPerCertType.keySet()) {
+ if (b.length() > 0) b.append(",");
+ b.append(type).append(":").append(numberPerCertType.get(type));
+ }
+ u.addObject(SHARES, b.toString());
+ }
+ return u;
+ }
+
+ @Override
public String getText() {
if (share == 0) return "";
- StringBuffer b = new StringBuffer();
+ StringBuilder b = new StringBuilder();
b.append(share).append("%");
if (portfolio.getOwner() instanceof Player
- && company.getPresident() == portfolio.getOwner()) {
+ && company.getPresident() == portfolio.getOwner()) {
b.append("P");
if (!company.hasFloated()) b.append("U");
b.append(company.getExtraShareMarks());
diff --git a/rails/ui/swing/GameStatus.java b/rails/ui/swing/GameStatus.java
index da0f965..29f55ea 100644
--- a/rails/ui/swing/GameStatus.java
+++ b/rails/ui/swing/GameStatus.java
@@ -16,6 +16,7 @@ import rails.game.*;
import rails.game.action.*;
import rails.game.correct.CashCorrectionAction;
import rails.ui.swing.elements.*;
+import rails.util.Util;
/**
* This class is incorporated into StatusWindow and displays the bulk of
@@ -942,13 +943,14 @@ public class GameStatus extends GridPanel implements ActionListener {
if (j < 0) return;
setPlayerCertButton(i, j, clickable);
+ if (clickable) syncToolTipText (certPerPlayer[i][j], certPerPlayerButton[i][j]);
if (clickable && o != null) {
if (o instanceof PossibleAction) {
certPerPlayerButton[i][j].addPossibleAction((PossibleAction) o);
if (o instanceof SellShares) {
- certPerPlayerButton[i][j].setToolTipText(LocalText.getText("ClickForSell"));
+ addToolTipText (certPerPlayerButton[i][j], LocalText.getText("ClickForSell"));
} else if (o instanceof BuyCertificate) {
- certPerPlayerButton[i][j].setToolTipText(LocalText.getText("ClickToSelectForBuying"));
+ addToolTipText (certPerPlayerButton[i][j], LocalText.getText("ClickToSelectForBuying"));
}
}
}
@@ -960,6 +962,7 @@ public class GameStatus extends GridPanel implements ActionListener {
if (clickable) {
certPerPlayerButton[i][j].setText(certPerPlayer[i][j].getText());
+ syncToolTipText (certPerPlayer[i][j], certPerPlayerButton[i][j]);
} else {
certPerPlayerButton[i][j].clearPossibleActions();
}
@@ -970,6 +973,7 @@ public class GameStatus extends GridPanel implements ActionListener {
protected void setIPOCertButton(int i, boolean clickable, Object o) {
setIPOCertButton(i, clickable);
+ if (clickable) syncToolTipText (certInIPO[i], certInIPOButton[i]);
if (clickable && o != null) {
if (o instanceof PossibleAction)
certInIPOButton[i].addPossibleAction((PossibleAction) o);
@@ -980,6 +984,7 @@ public class GameStatus extends GridPanel implements ActionListener {
boolean visible = rowVisibilityObservers[i].lastValue();
if (clickable) {
certInIPOButton[i].setText(certInIPO[i].getText());
+ syncToolTipText (certInIPO[i], certInIPOButton[i]);
} else {
certInIPOButton[i].clearPossibleActions();
}
@@ -990,6 +995,7 @@ public class GameStatus extends GridPanel implements ActionListener {
protected void setPoolCertButton(int i, boolean clickable, Object o) {
setPoolCertButton(i, clickable);
+ if (clickable) syncToolTipText (certInPool[i], certInPoolButton[i]);
if (clickable && o != null) {
if (o instanceof PossibleAction)
certInPoolButton[i].addPossibleAction((PossibleAction) o);
@@ -1000,6 +1006,7 @@ public class GameStatus extends GridPanel implements ActionListener {
boolean visible = rowVisibilityObservers[i].lastValue();
if (clickable) {
certInPoolButton[i].setText(certInPool[i].getText());
+ syncToolTipText (certInIPO[i], certInIPOButton[i]);
} else {
certInPoolButton[i].clearPossibleActions();
}
@@ -1011,6 +1018,7 @@ public class GameStatus extends GridPanel implements ActionListener {
setTreasuryCertButton(i, clickable);
if (clickable && o != null) {
+ if (clickable) syncToolTipText (certInTreasury[i], certInTreasuryButton[i]);
if (o instanceof PossibleAction)
certInTreasuryButton[i].addPossibleAction((PossibleAction) o);
}
@@ -1020,6 +1028,7 @@ public class GameStatus extends GridPanel implements ActionListener {
boolean visible = rowVisibilityObservers[i].lastValue();
if (clickable) {
certInTreasuryButton[i].setText(certInTreasury[i].getText());
+ syncToolTipText (certInTreasury[i], certInTreasuryButton[i]);
} else {
certInTreasuryButton[i].clearPossibleActions();
}
@@ -1054,4 +1063,16 @@ public class GameStatus extends GridPanel implements ActionListener {
if (action != null)
playerCashButton[i].addPossibleAction(action);
}
+
+ protected void syncToolTipText (Field field, ClickField clickField) {
+ String baseText = field.getToolTipText();
+ clickField.setToolTipText(Util.hasValue(baseText) ? baseText : "");
+ }
+
+ protected void addToolTipText (ClickField clickField, String addText) {
+ if (!Util.hasValue(addText)) return;
+ String baseText = clickField.getToolTipText();
+ clickField.setToolTipText(Util.hasValue(baseText) ? baseText+"<br>"+addText : addText);
+ }
+
}
diff --git a/rails/ui/swing/elements/Field.java b/rails/ui/swing/elements/Field.java
index 76b674f..1c7816f 100644
--- a/rails/ui/swing/elements/Field.java
+++ b/rails/ui/swing/elements/Field.java
@@ -8,8 +8,7 @@ import java.util.*;
import javax.swing.*;
import javax.swing.border.Border;
-import rails.game.model.ModelObject;
-import rails.game.model.ViewUpdate;
+import rails.game.model.*;
import rails.util.Util;
public class Field extends JLabel implements ViewObject {
@@ -31,6 +30,9 @@ public class Field extends JLabel implements ViewObject {
private boolean html = false;
+ /** Intended for (possibly varying) tooltip text that must be held across player actions */
+ private String baseToolTipInfo = null;
+
public Field(String text) {
super(text.equals("0%") ? "" : text);
this.setBackground(NORMAL_BG_COLOUR);
@@ -120,6 +122,23 @@ public class Field extends JLabel implements ViewObject {
setBackground((Color)vu.getValue(key));
normalBgColour = getBackground();
setForeground (Util.isDark(normalBgColour) ? Color.WHITE : Color.BLACK);
+ } else if (ShareModel.SHARES.equalsIgnoreCase(key)) {
+ int count;
+ String type;
+ String[] items;
+ StringBuilder b = new StringBuilder();
+ for (String typeAndCount : ((String)vu.getValue(key)).split(",")) {
+ Util.getLogger().debug(">>> "+typeAndCount+" <<<");
+ if (!Util.hasValue(typeAndCount)) continue;
+ items = typeAndCount.split(":");
+ count = Integer.parseInt(items[1]);
+ items = items[0].split("_");
+ type = items[1] + (items.length > 2 && items[2].contains("P") ? "P" : "");
+ if (b.length() > 0) b.append("<br>");
+ b.append(count).append(" x ").append(type);
+ }
+ baseToolTipInfo = b.toString();
+ setToolTipText ("<html>" + baseToolTipInfo);
}
}
}
@@ -142,4 +161,10 @@ public class Field extends JLabel implements ViewObject {
public void setHtml() {
html = true;
}
+
+ public String getBaseToolTipInfo() {
+ return baseToolTipInfo;
+ }
+
+
}
|