From 75384b78e34adc27fe5f8591dd54ea02e6e13a56 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Sat, 20 Apr 2013 07:41:20 +0000 Subject: [PATCH] CField: click with meta key down is handled by the very input class. (a parameter added to selectCard) VCombat: !parentCell.getSelected() won't NPE any longer (unless if parentCell is null for that thread), moved most thread-unsafe actions from update() to ctor and populate PhaseHandler: bCombat is AtomicBoolean to be retrieved correctly from any thread. --- src/main/java/forge/control/input/Input.java | 2 +- .../java/forge/control/input/InputAttack.java | 14 +++-- .../java/forge/control/input/InputBase.java | 2 +- .../java/forge/control/input/InputBlock.java | 36 +++++++------ .../forge/control/input/InputCleanup.java | 2 +- .../java/forge/control/input/InputLockUI.java | 2 +- .../forge/control/input/InputMulligan.java | 2 +- .../input/InputPartialParisMulligan.java | 2 +- .../control/input/InputPassPriority.java | 2 +- .../control/input/InputSyncronizedBase.java | 2 +- src/main/java/forge/game/ai/AiController.java | 2 +- src/main/java/forge/game/ai/AiInputBlock.java | 2 +- .../java/forge/game/phase/CombatUtil.java | 19 ++++--- .../java/forge/game/phase/PhaseHandler.java | 25 ++++----- .../game/player/PlayerControllerHuman.java | 2 +- src/main/java/forge/gui/FNetOverlay.java | 8 +-- src/main/java/forge/gui/InputProxy.java | 2 +- .../forge/gui/match/nonsingleton/CField.java | 51 +++---------------- .../java/forge/gui/match/views/VCombat.java | 31 ++++++----- 19 files changed, 89 insertions(+), 119 deletions(-) diff --git a/src/main/java/forge/control/input/Input.java b/src/main/java/forge/control/input/Input.java index 4d479e66eb8..93955c44503 100644 --- a/src/main/java/forge/control/input/Input.java +++ b/src/main/java/forge/control/input/Input.java @@ -12,7 +12,7 @@ public interface Input { // showMessage() is always the first method called void showMessage(); - void selectCard(Card c); + void selectCard(Card c, boolean isMetaDown); void selectPlayer(Player player); diff --git a/src/main/java/forge/control/input/InputAttack.java b/src/main/java/forge/control/input/InputAttack.java index 71e64d60776..718c5cd0e21 100644 --- a/src/main/java/forge/control/input/InputAttack.java +++ b/src/main/java/forge/control/input/InputAttack.java @@ -80,7 +80,7 @@ public class InputAttack extends InputBase { @Override public final void selectButtonOK() { if (!game.getCombat().getAttackers().isEmpty()) { - game.getPhaseHandler().setCombat(true); + game.getPhaseHandler().setCombat(); } if (game.getCombat().getRemainingDefenders() != 0) { @@ -93,7 +93,15 @@ public class InputAttack extends InputBase { /** {@inheritDoc} */ @Override - public final void selectCard(final Card card) { + public final void selectCard(final Card card, boolean isMetaDown) { + final List att = game.getCombat().getAttackers(); + if (isMetaDown && att.contains(card) && !card.hasKeyword("CARDNAME attacks each turn if able.")) { + card.untap(); + game.getCombat().removeFromCombat(card); + CombatUtil.showCombat(game); + return; + } + if (card.isAttacking() || card.getController() != Singletons.getControl().getPlayer()) { return; } @@ -112,7 +120,7 @@ public class InputAttack extends InputBase { // just to make sure the attack symbol is marked human.getZone(ZoneType.Battlefield).updateObservers(); - CombatUtil.showCombat(); + CombatUtil.showCombat(game); ButtonUtil.enableOnlyOk(); } else { diff --git a/src/main/java/forge/control/input/InputBase.java b/src/main/java/forge/control/input/InputBase.java index d3da28bee70..fb917b670b4 100644 --- a/src/main/java/forge/control/input/InputBase.java +++ b/src/main/java/forge/control/input/InputBase.java @@ -44,7 +44,7 @@ public abstract class InputBase implements java.io.Serializable, Input { public abstract void showMessage(); @Override - public void selectCard(final Card c) { } + public void selectCard(final Card c, boolean isMetaDown) { } @Override public void selectPlayer(final Player player) { } @Override diff --git a/src/main/java/forge/control/input/InputBlock.java b/src/main/java/forge/control/input/InputBlock.java index 29ad874a3c0..83934150f11 100644 --- a/src/main/java/forge/control/input/InputBlock.java +++ b/src/main/java/forge/control/input/InputBlock.java @@ -47,24 +47,18 @@ public class InputBlock extends InputBase { private Card currentAttacker = null; private final HashMap> allBlocking = new HashMap>(); - + private final GameState game; + /** * TODO: Write javadoc for Constructor. * @param priority */ - public InputBlock(Player human) { + public InputBlock(Player human, GameState game) { super(human); + this.game = game; } - /** - *

- * removeFromAllBlocking. - *

- * - * @param c - * a {@link forge.Card} object. - */ - public final void removeFromAllBlocking(final Card c) { + private final void removeFromAllBlocking(final Card c) { this.allBlocking.remove(c); } @@ -89,17 +83,16 @@ public class InputBlock extends InputBase { CMatchUI.SINGLETON_INSTANCE.showMessage(sb.toString()); } - CombatUtil.showCombat(); + CombatUtil.showCombat(game); } /** {@inheritDoc} */ @Override public final void selectButtonOK() { - final GameState game = Singletons.getModel().getGame(); if (CombatUtil.finishedMandatoryBlocks(game.getCombat(), player)) { // Done blocking ButtonUtil.reset(); - CombatUtil.orderMultipleCombatants(game.getCombat()); + CombatUtil.orderMultipleCombatants(game); currentAttacker = null; allBlocking.clear(); @@ -109,11 +102,22 @@ public class InputBlock extends InputBase { /** {@inheritDoc} */ @Override - public final void selectCard(final Card card) { + public final void selectCard(final Card card, boolean isMetaDown) { + + + if (isMetaDown) { + if (card.getController() == Singletons.getControl().getPlayer() ) { + game.getCombat().removeFromCombat(card); + } + removeFromAllBlocking(card); + CombatUtil.showCombat(game); + return; + } + // is attacking? boolean reminder = true; - if (Singletons.getModel().getGame().getCombat().getAttackers().contains(card)) { + if (game.getCombat().getAttackers().contains(card)) { this.currentAttacker = card; reminder = false; } else { diff --git a/src/main/java/forge/control/input/InputCleanup.java b/src/main/java/forge/control/input/InputCleanup.java index 0f0f21c4ef5..c1d65505b4e 100644 --- a/src/main/java/forge/control/input/InputCleanup.java +++ b/src/main/java/forge/control/input/InputCleanup.java @@ -73,7 +73,7 @@ public class InputCleanup extends InputBase { /** {@inheritDoc} */ @Override - public final void selectCard(final Card card) { + public final void selectCard(final Card card, boolean isMetaDown) { Zone zone = game.getZoneOf(card); if (!zone.is(ZoneType.Hand, Singletons.getControl().getPlayer())) return; diff --git a/src/main/java/forge/control/input/InputLockUI.java b/src/main/java/forge/control/input/InputLockUI.java index 0a959b0f5a3..404a31659d1 100644 --- a/src/main/java/forge/control/input/InputLockUI.java +++ b/src/main/java/forge/control/input/InputLockUI.java @@ -58,7 +58,7 @@ public class InputLockUI implements Input { CMatchUI.SINGLETON_INSTANCE.showMessage(message); } - @Override public void selectCard(Card c) {} + @Override public void selectCard(Card c, boolean isMetaDown) {} @Override public void selectPlayer(Player player) {} @Override public void selectButtonOK() {} @Override public void selectButtonCancel() {} diff --git a/src/main/java/forge/control/input/InputMulligan.java b/src/main/java/forge/control/input/InputMulligan.java index f6283df6c3e..48a7db7ecad 100644 --- a/src/main/java/forge/control/input/InputMulligan.java +++ b/src/main/java/forge/control/input/InputMulligan.java @@ -129,7 +129,7 @@ public class InputMulligan extends InputBase { } @Override - public void selectCard(Card c0) { + public void selectCard(Card c0, boolean isMetaDown) { Zone z0 = match.getCurrentGame().getZoneOf(c0); if (c0.getName().equals("Serum Powder") && z0.is(ZoneType.Hand)) { if (GuiDialog.confirm(c0, "Use " + c0.getName() + "'s ability?")) { diff --git a/src/main/java/forge/control/input/InputPartialParisMulligan.java b/src/main/java/forge/control/input/InputPartialParisMulligan.java index 60bdee6ca3d..e88aa258c16 100644 --- a/src/main/java/forge/control/input/InputPartialParisMulligan.java +++ b/src/main/java/forge/control/input/InputPartialParisMulligan.java @@ -181,7 +181,7 @@ public class InputPartialParisMulligan extends InputBase { } @Override - public void selectCard(Card c0) { + public void selectCard(Card c0, boolean isMetaDown) { if(lastExiled.contains(c0)) { lastExiled.remove(c0); diff --git a/src/main/java/forge/control/input/InputPassPriority.java b/src/main/java/forge/control/input/InputPassPriority.java index cb70b4fd519..9ae14177c1b 100644 --- a/src/main/java/forge/control/input/InputPassPriority.java +++ b/src/main/java/forge/control/input/InputPassPriority.java @@ -80,7 +80,7 @@ public class InputPassPriority extends InputBase { /** {@inheritDoc} */ @Override - public final void selectCard(final Card card) { + public final void selectCard(final Card card, boolean isMetaDown) { final SpellAbility ab = player.getController().getAbilityToPlay(player.getGame().getAbilitesOfCard(card, player)); if ( null != ab) { Runnable execAbility = new Runnable() { diff --git a/src/main/java/forge/control/input/InputSyncronizedBase.java b/src/main/java/forge/control/input/InputSyncronizedBase.java index b0e71ecc71f..a0900b496e6 100644 --- a/src/main/java/forge/control/input/InputSyncronizedBase.java +++ b/src/main/java/forge/control/input/InputSyncronizedBase.java @@ -48,7 +48,7 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn } @Override - public final void selectCard(Card c) { + public final void selectCard(Card c, boolean isMetaDown) { if( finished ) return; onCardSelected(c); } diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java index 1d0ef70269b..4de027de191 100644 --- a/src/main/java/forge/game/ai/AiController.java +++ b/src/main/java/forge/game/ai/AiController.java @@ -828,7 +828,7 @@ public class AiController { final List att = game.getCombat().getAttackers(); if (!att.isEmpty()) { - game.getPhaseHandler().setCombat(true); + game.getPhaseHandler().setCombat(); } for (final Card element : att) { diff --git a/src/main/java/forge/game/ai/AiInputBlock.java b/src/main/java/forge/game/ai/AiInputBlock.java index 55873b3bfe7..90638e7092a 100644 --- a/src/main/java/forge/game/ai/AiInputBlock.java +++ b/src/main/java/forge/game/ai/AiInputBlock.java @@ -32,7 +32,7 @@ public class AiInputBlock extends InputBase { // TODO Auto-generated method stub final List blockers = player.getCreaturesInPlay(); game.setCombat(ComputerUtilBlock.getBlockers(player, game.getCombat(), blockers)); - CombatUtil.orderMultipleCombatants(game.getCombat()); + CombatUtil.orderMultipleCombatants(game); game.getPhaseHandler().setPlayersPriorityPermission(false); // was not added to stack, so will be replaced by plain update diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index 48ebde8405f..5f5214db189 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -425,16 +425,20 @@ public class CombatUtil { return true; } - public static void orderMultipleCombatants(final Combat combat) { + public static void orderMultipleCombatants(final GameState game) { + final Combat combat = game.getCombat(); + CombatUtil.orderMultipleBlockers(combat); + CombatUtil.showCombat(game); + CombatUtil.orderBlockingMultipleAttackers(combat); + CombatUtil.showCombat(game); } private static void orderMultipleBlockers(final Combat combat) { // If there are multiple blockers, the Attacker declares the Assignment Order final Player player = combat.getAttackingPlayer(); - final List attackers = combat.getAttackers(); - for (final Card attacker : attackers) { + for (final Card attacker : combat.getAttackers()) { List blockers = combat.getBlockers(attacker); if (blockers.size() <= 1) { continue; @@ -442,7 +446,7 @@ public class CombatUtil { List orderedBlockers = player.getController().orderBlockers(attacker, blockers); combat.setBlockerList(attacker, orderedBlockers); } - CombatUtil.showCombat(); + // Refresh Combat Panel } @@ -457,7 +461,6 @@ public class CombatUtil { List orderedAttacker = blocker.getController().getController().orderAttackers(blocker, attackers); combat.setAttackersBlockedByList(blocker, orderedAttacker); } - CombatUtil.showCombat(); // Refresh Combat Panel } @@ -1081,11 +1084,11 @@ public class CombatUtil { * showCombat. *

*/ - public static void showCombat() { + public static void showCombat(GameState game) { // TODO(sol) ShowCombat seems to be resetting itself when switching away and switching back? String text = ""; - if (Singletons.getModel().getGame().getPhaseHandler().inCombat()) { - text = getCombatDescription(Singletons.getModel().getGame().getCombat()); + if (game.getPhaseHandler().inCombat()) { + text = getCombatDescription(game.getCombat()); SDisplayUtil.showTab(EDocID.REPORT_COMBAT.getDoc()); } VCombat.SINGLETON_INSTANCE.updateCombat(text); diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 3b05f691fdb..d0b18d698f7 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -20,6 +20,7 @@ package forge.game.phase; import java.util.HashMap; import java.util.Map; import java.util.Stack; +import java.util.concurrent.atomic.AtomicBoolean; import com.esotericsoftware.minlog.Log; @@ -71,7 +72,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { private Player pPlayerPriority = null; private Player pFirstPriority = null; private boolean bPhaseEffects = true; - private boolean bCombat = false; + private AtomicBoolean bCombat = new AtomicBoolean(false); private boolean bRepeat = false; /** The need to next phase. */ @@ -203,7 +204,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { * @return a boolean. */ public final boolean inCombat() { - return this.bCombat; + return this.bCombat.get(); } /** @@ -214,8 +215,8 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { * @param b * a boolean. */ - public final void setCombat(final boolean b) { - this.bCombat = b; + public final void setCombat() { + this.bCombat.set(true); } /** @@ -293,7 +294,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { case COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY: if (this.inCombat()) { PhaseUtil.handleDeclareAttackers(game); - CombatUtil.showCombat(); + CombatUtil.showCombat(game); } else { this.setPlayersPriorityPermission(false); } @@ -302,7 +303,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { case COMBAT_DECLARE_BLOCKERS: if (this.inCombat()) { game.getCombat().verifyCreaturesInPlay(); - CombatUtil.showCombat(); + CombatUtil.showCombat(game); } else { this.setPlayersPriorityPermission(false); } @@ -313,7 +314,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { // blocked and trigger blocking things if (this.inCombat()) { PhaseUtil.handleDeclareBlockers(game); - CombatUtil.showCombat(); + CombatUtil.showCombat(game); } else { this.setPlayersPriorityPermission(false); } @@ -331,7 +332,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { } else { game.getCombat().dealAssignedDamage(); game.getAction().checkStateEffects(); - CombatUtil.showCombat(); + CombatUtil.showCombat(game); } } break; @@ -347,7 +348,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { } else { game.getCombat().dealAssignedDamage(); game.getAction().checkStateEffects(); - CombatUtil.showCombat(); + CombatUtil.showCombat(game); } } break; @@ -356,12 +357,12 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { // End Combat always happens game.getEndOfCombat().executeUntil(); game.getEndOfCombat().executeAt(); - CombatUtil.showCombat(); + CombatUtil.showCombat(game); //SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); break; case MAIN2: - CombatUtil.showCombat(); + CombatUtil.showCombat(game); //SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); break; @@ -462,7 +463,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { //SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); game.getCombat().reset(); this.getPlayerTurn().resetAttackedThisCombat(); - this.bCombat = false; + this.bCombat.set(false); break; diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 379790b7316..92147f21971 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -60,7 +60,7 @@ public class PlayerControllerHuman extends PlayerController { player = p; defaultInput = new InputPassPriority(player); - blockInput = new InputBlock(getPlayer()); + blockInput = new InputBlock(getPlayer(), game0); cleanupInput = new InputCleanup(getPlayer()); autoPassPriorityInput = new InputAutoPassPriority(getPlayer()); } diff --git a/src/main/java/forge/gui/FNetOverlay.java b/src/main/java/forge/gui/FNetOverlay.java index a47a4a14a34..292a9ea9d1c 100644 --- a/src/main/java/forge/gui/FNetOverlay.java +++ b/src/main/java/forge/gui/FNetOverlay.java @@ -4,9 +4,6 @@ import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseMotionAdapter; import java.text.SimpleDateFormat; import java.util.Date; @@ -80,10 +77,7 @@ public enum FNetOverlay { // pnl.add(new FLabel.Builder().text("Loading new game...").fontSize(22).build(), "h 40px!, align center"); // Block all input events below the overlay - pnl.addMouseListener(new MouseAdapter() { }); - pnl.addMouseMotionListener(new MouseMotionAdapter() { }); - pnl.addKeyListener(new KeyAdapter() { }); - + txtLog.setOpaque(true); txtLog.setFocusable(true); txtLog.setBackground(FSkin.getColor(FSkin.Colors.CLR_ZEBRA)); diff --git a/src/main/java/forge/gui/InputProxy.java b/src/main/java/forge/gui/InputProxy.java index ad619a605bb..5c44c019cfa 100644 --- a/src/main/java/forge/gui/InputProxy.java +++ b/src/main/java/forge/gui/InputProxy.java @@ -138,7 +138,7 @@ public class InputProxy implements Observer { public final void selectCard(final Card card) { Input inp = getInput(); if ( null != inp ) - inp.selectCard(card); + inp.selectCard(card, false); } /** {@inheritDoc} */ diff --git a/src/main/java/forge/gui/match/nonsingleton/CField.java b/src/main/java/forge/gui/match/nonsingleton/CField.java index ca602182919..8150b5ee019 100644 --- a/src/main/java/forge/gui/match/nonsingleton/CField.java +++ b/src/main/java/forge/gui/match/nonsingleton/CField.java @@ -40,11 +40,8 @@ import forge.card.cardfactory.CardFactory; import forge.card.cardfactory.CardFactoryUtil; import forge.card.spellability.SpellAbility; import forge.control.input.Input; -import forge.control.input.InputAttack; -import forge.control.input.InputBlock; import forge.control.input.InputPayManaBase; import forge.game.GameState; -import forge.game.phase.CombatUtil; import forge.game.player.HumanPlayer; import forge.game.player.Player; import forge.game.zone.PlayerZone; @@ -56,7 +53,6 @@ import forge.gui.framework.ICDoc; import forge.gui.match.CMatchUI; import forge.gui.match.controllers.CMessage; import forge.gui.toolbox.FLabel; -import forge.view.arcane.CardPanel; /** * Controls Swing components of a player's field instance. @@ -397,48 +393,13 @@ public class CField implements ICDoc { if (c == null || !c.isInZone(ZoneType.Battlefield)) { return; } - - // Why does CField filter cards here? That's Input's responsibility to detect incorrect choices! - if (c.isTapped() && input instanceof InputPayManaBase) { - final CardPanel cardPanel = CField.this.view.getTabletop().getCardPanel(c.getUniqueNumber()); - for (final CardPanel cp : cardPanel.getAttachedPanels()) { - if (cp.getCard().isUntapped()) { - break; - } - } - } - final List att = Singletons.getModel().getGame().getCombat().getAttackers(); - if ((c.isTapped() || c.hasSickness() || (c.hasKeyword("Vigilance") && att.contains(c))) && (input instanceof InputAttack)) { - final CardPanel cardPanel = CField.this.view.getTabletop().getCardPanel(c.getUniqueNumber()); - for (final CardPanel cp : cardPanel.getAttachedPanels()) { - if (cp.getCard().isUntapped() && !cp.getCard().hasSickness()) { - break; - } - } - } - - if (e.isMetaDown()) { - if (att.contains(c) && input instanceof InputAttack && !c.hasKeyword("CARDNAME attacks each turn if able.")) { - c.untap(); - Singletons.getModel().getGame().getCombat().removeFromCombat(c); - CombatUtil.showCombat(); - } else if (input instanceof InputBlock) { - if (c.getController() == Singletons.getControl().getPlayer() ) { - Singletons.getModel().getGame().getCombat().removeFromCombat(c); - } - ((InputBlock) input).removeFromAllBlocking(c); - CombatUtil.showCombat(); - } - } else if ( input != null ){ - //Yosei, the Morning Star required cards to be chosen on computer side - //earlier it was enforced that cards must be in player zone - //this can potentially break some other functionality - //(tapping lands works ok but some custom cards may not...) - - - //in weird case card has no controller revert to default behaviour - input.selectCard(c); + //Yosei, the Morning Star required cards to be chosen on computer side + //earlier it was enforced that cards must be in player zone + //this can potentially break some other functionality + //(tapping lands works ok but some custom cards may not...) + if ( input != null ){ + input.selectCard(c, e.isMetaDown()); } } diff --git a/src/main/java/forge/gui/match/views/VCombat.java b/src/main/java/forge/gui/match/views/VCombat.java index bc66067c49b..69bf970da4d 100644 --- a/src/main/java/forge/gui/match/views/VCombat.java +++ b/src/main/java/forge/gui/match/views/VCombat.java @@ -18,7 +18,6 @@ package forge.gui.match.views; import javax.swing.JTextArea; -import javax.swing.border.Border; import javax.swing.border.MatteBorder; import net.miginfocom.swing.MigLayout; @@ -42,7 +41,17 @@ public enum VCombat implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; private final DragTab tab = new DragTab("Combat"); + + final JTextArea tar = new JTextArea(); + private VCombat() { + tar.setOpaque(false); + tar.setBorder(new MatteBorder(0, 0, 0, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS))); + tar.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); + tar.setFocusable(false); + tar.setLineWrap(true); + } + //========== Overridden methods /* (non-Javadoc) @@ -50,7 +59,9 @@ public enum VCombat implements IVDoc { */ @Override public void populate() { - // (Panel uses observers to update, no permanent components here.) + parentCell.getBody().removeAll(); + parentCell.getBody().setLayout(new MigLayout("insets 0, gap 0, wrap")); + parentCell.getBody().add(tar, "w 95%!, gapleft 3%, gaptop 1%, h 95%"); } /* (non-Javadoc) @@ -98,21 +109,9 @@ public enum VCombat implements IVDoc { /** @param s0   {@link java.lang.String} */ public void updateCombat(final String s0) { // No need to update this unless it's showing - if (!parentCell.getSelected().equals(this)) { return; } - - parentCell.getBody().removeAll(); - parentCell.getBody().setLayout(new MigLayout("insets 0, gap 0, wrap")); - - final Border border = new MatteBorder(0, 0, 0, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)); + if (!this.equals(parentCell.getSelected())) { return; } tab.setText("Combat : " + Singletons.getModel().getGame().getCombat().getAttackers().size()); - - final JTextArea tar = new JTextArea(s0); - tar.setOpaque(false); - tar.setBorder(border); - tar.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - tar.setFocusable(false); - tar.setLineWrap(true); - parentCell.getBody().add(tar, "w 95%!, gapleft 3%, gaptop 1%, h 95%"); + tar.setText(s0); } }