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; + } + + } |