package rabbitescape.ui.swing;
import static rabbitescape.engine.i18n.Translation.*;
import static rabbitescape.engine.util.Util.*;
import static rabbitescape.ui.swing.SwingConfigSetup.*;
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.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToggleButton;
import rabbitescape.engine.Token;
import rabbitescape.engine.config.Config;
import rabbitescape.engine.config.ConfigTools;
import rabbitescape.render.BitmapCache;
class GameMenu
{
public static interface AbilityChangedListener
{
void abilityChosen( Token.Type ability );
}
private static final int ICON_SIZE = 32;
public JToggleButton mute;
public JToggleButton pause;
public JToggleButton speed;
public final JButton explodeAll;
public final JButton zoomIn;
public final JButton zoomOut;
public final JButton back;
private final BitmapCache<SwingBitmap> bitmapCache;
private final Color backgroundColor;
private final JPanel panel;
public final Map<Token.Type, JToggleButton> abilities;
public GameMenu(
Container contentPane,
BitmapCache<SwingBitmap> bitmapCache,
Dimension buttonSizeInPixels,
Config uiConfig,
Color backgroundColor,
Map<Token.Type, Integer> abilityTypes
)
{
this.bitmapCache = bitmapCache;
this.backgroundColor = backgroundColor;
this.panel = createPanel( contentPane );
this.mute = addToggleButton(
"menu_unmuted",
"menu_muted",
ConfigTools.getBool( uiConfig, CFG_MUTED ),
t( "Mute" )
);
this.pause = addToggleButton(
"menu_pause", "menu_unpause", false, t( "Pause" ) );
addSpacer();
this.abilities = addAbilitiesButtons( abilityTypes );
addSpacer();
this.explodeAll = addButton( "menu_explode_all", t( "Explode all" ) );
this.speed = addToggleButton(
"menu_speedup_inactive", "menu_speedup_active", false, t( "speed up" ) );
this.zoomIn = addButton( "menu_zoom_in", t( "Zoom in" ) );
this.zoomOut = addButton( "menu_zoom_out", t( "Zoom out" ) );
this.back = addButton( "menu_back", t( "Back" ) );
panel.setPreferredSize(
new Dimension(
buttonSizeInPixels.width + 8,
( 2 * 16 ) // Spacers
+ ( 6 + abilityTypes.size() ) // Buttons
* ( 16 + buttonSizeInPixels.height )
)
);
addPanelInScrollPane( contentPane );
}
private void addPanelInScrollPane( Container contentPane )
{
JScrollPane scrollPane = new JScrollPane( panel );
scrollPane.getVerticalScrollBar().setUnitIncrement( 16 );
contentPane.add( scrollPane, BorderLayout.WEST );
}
private JPanel createPanel( Container contentPane )
{
LayoutManager layout = new FlowLayout( FlowLayout.CENTER, 4, 4 );
JPanel ret = new JPanel( layout );
ret.setBackground( backgroundColor );
return ret;
}
private Map<Token.Type, JToggleButton> addAbilitiesButtons(
Map<Token.Type, Integer> abilityTypes )
{
Map<Token.Type, JToggleButton> ret = new HashMap<>();
ButtonGroup abilitiesGroup = new ButtonGroup();
int key = KeyEvent.VK_1;
for ( Token.Type ability : sorted( abilityTypes.keySet() ) )
{
String iconName = "ability_" + ability.toString();
JToggleButton button = addToggleButton(
iconName, null, false, t( Token.name( ability ) ) );
MenuTools.clickOnKey( button, iconName, key );
ret.put( ability, button );
abilitiesGroup.add( button );
++key;
}
return ret;
}
private void addSpacer()
{
JPanel spacer = new JPanel();
spacer.setBackground( backgroundColor );
panel.add( spacer );
}
private JToggleButton addToggleButton(
String unSelectedImage,
String selectedImage,
boolean selected,
String description
)
{
JToggleButton button = new JToggleButton( getIcon( unSelectedImage ) );
button.setBackground( backgroundColor );
button.setBorderPainted( false );
button.setSelected( selected );
button.setToolTipText( description );
if ( selectedImage != null )
{
button.setSelectedIcon( getIcon( selectedImage ) );
}
panel.add( button );
return button;
}
private JButton addButton( String image, String description )
{
JButton button = new JButton( getIcon( image ) );
button.setBackground( backgroundColor );
button.setBorderPainted( false );
button.setToolTipText( description );
panel.add( button );
return button;
}
private ImageIcon getIcon( String name )
{
return new ImageIcon(
bitmapCache.get( name, ICON_SIZE ).image );
}
public void addAbilitiesListener( final AbilityChangedListener listener )
{
for (
final Map.Entry<Token.Type, JToggleButton> abilityEntry
: abilities.entrySet()
)
{
abilityEntry.getValue().addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent evt )
{
listener.abilityChosen( abilityEntry.getKey() );
}
} );
}
}
}