package rabbitescape.ui.swing; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.LayoutManager; import java.util.Map; import javax.swing.*; import rabbitescape.engine.Token; import rabbitescape.render.gameloop.Physics; import static rabbitescape.engine.i18n.Translation.t; import static rabbitescape.engine.util.Util.*; public class TopBar implements Physics.StatsChangedListener { private static final String outText = "Out: ${num1} / ${num2}"; private static final String savedText = "Saved: ${num1} / ${num2}"; private static final String abilityText = "${ability} (${numLeft} left)"; private final Color backgroundColor; private final JPanel panel; private final JLabel out; private final JLabel saved; private final JLabel ability; private final int numToSave; public TopBar( Color backgroundColor, int numToSave, Container contentPane, String worldName ) { this.backgroundColor = backgroundColor; this.panel = createPanel( contentPane ); addLabel( worldName, 300 ); this.ability = addLabel( "" ); this.out = addLabel( outText ); this.saved = addLabel( savedText ); setCountText( this.saved, savedText, 0, numToSave ); setCountText( this.out, outText, 0, 0 ); this.numToSave = numToSave; } private JPanel createPanel( Container contentPane ) { LayoutManager layout = new FlowLayout( FlowLayout.CENTER, 4, 4 ); JPanel ret = new JPanel( layout ); ret.setBackground( backgroundColor ); contentPane.add( ret, BorderLayout.NORTH ); return ret; } private JLabel addLabel( String text, int width ) { JLabel ret = new JLabel( t( text, newMap( "num", "" ) ) ); ret.setPreferredSize( new Dimension( width, 20 ) ); panel.add( ret ); return ret; } private JLabel addLabel( String text ) { return addLabel( text, 200); } @Override public void changed( int waiting, int out, int saved ) { setCountText( this.out, outText, out, waiting+out ); setCountText( this.saved, savedText, saved, numToSave ); } public void abilityChanged( Token.Type ability, int numLeft ) { setAbilityText( this.ability, abilityText, ability.name(), numLeft ); } private void setCountText( JLabel label, String text, int num1, int num2 ) { setText( label, text, newMap( "num1", String.valueOf( num1 ), "num2", String.valueOf( num2 ) ) ); } private void setAbilityText( JLabel label, String text, String ability, int numLeft ) { setText( label, text, newMap( "ability", ability, "numLeft", String.valueOf( numLeft ) ) ); } private void setText( final JLabel label, final String text, final Map<String, Object> params ) { SwingUtilities.invokeLater( new Runnable() { @Override public void run() { label.setText( t( text, params ) ); } } ); } }