package de.lighti.components.player.statistics;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import de.lighti.model.AppState;
import de.lighti.model.Statics;
import de.lighti.model.game.Ability;
import de.lighti.model.game.Dota2Item;
import de.lighti.model.game.Hero;
import de.lighti.model.game.Player;
public class PlayerComponent extends JSplitPane {
/**
*
*/
private static final long serialVersionUID = 1L;
private final AppState appState;
private JComboBox<String> playerBox;
private final static NumberFormat TWO_DIGITS = new DecimalFormat( "#####.##" );
public PlayerComponent( AppState appState ) {
super( JSplitPane.HORIZONTAL_SPLIT, null, null );
this.appState = appState;
setOneTouchExpandable( false );
setDividerLocation( 150 );
setDividerSize( 0 );
setBorder( BorderFactory.createEmptyBorder( 5, 5, 5, 5 ) );
setLeftComponent( createLeftComponent() );
setRightComponent( createRightComponent() );
}
private Component createLeftComponent() {
final JPanel leftPane = new JPanel();
leftPane.setLayout( new BoxLayout( leftPane, BoxLayout.Y_AXIS ) );
leftPane.add( getPlayerBox() );
leftPane.add( Box.createVerticalGlue() );
leftPane.setBorder( BorderFactory.createTitledBorder( BorderFactory.createEmptyBorder( 5, 5, 5, 5 ), Statics.PLAYER ) );
return leftPane;
}
private JComponent createPlayerBuildOrderTab() {
final BuildOrderComponent bc = new BuildOrderComponent();
getPlayerBox().addItemListener( new java.awt.event.ItemListener() {
@Override
public void itemStateChanged( ItemEvent e ) {
final String id = (String) playerBox.getSelectedItem();
if (id == null) {
return;
}
final Player p = appState.getPlayerByName( id );
final Queue<Dota2Item> buildOrder = new LinkedBlockingQueue<Dota2Item>();
final Hero hero = p.getHero();
if (hero != null) {
final Queue<Hero.ItemEvent> completeLog = hero.getItemLog();
for (final Hero.ItemEvent n : completeLog) {
//Only the bag, and only added items
if (n.slot <= 5 && n.added) {
buildOrder.add( n.item );
}
// if (n.startsWith( "+" )) {
// buildOrder.add( appState.getItemByName( n.substring( 1 ) ) );
// }
}
bc.setItems( buildOrder );
}
}
} );
return bc;
}
private JComponent createPlayerSkillTreeTab() {
final SkillTreecomponent c = new SkillTreecomponent();
getPlayerBox().addItemListener( new java.awt.event.ItemListener() {
@Override
public void itemStateChanged( ItemEvent e ) {
final String id = (String) playerBox.getSelectedItem();
if (id == null) {
return;
}
final Player p = appState.getPlayerByName( id );
final Hero hero = p.getHero();
final List<Ability> abilities = new ArrayList<Ability>();
for (final Ability a : hero.getAbilities()) {
abilities.add( a );
}
c.setAbilities( abilities );
c.repaint();
}
} );
return c;
}
private JComponent createPlayerStatisticsTab() {
final JTable table = new JTable();
final TableModel model = new DefaultTableModel( 8, 2 ) {
/**
*
*/
private static final long serialVersionUID = -5417710077260844257L;
@Override
public boolean isCellEditable( int row, int column ) {
//all cells false
return false;
}
};
table.setModel( model );
model.setValueAt( Statics.NAME, 0, 0 );
model.setValueAt( Statics.TEAM, 1, 0 );
model.setValueAt( Statics.HERO, 2, 0 );
model.setValueAt( Statics.TOTAL_GOLD, 3, 0 );
model.setValueAt( Statics.GOLD_PER_MINUTE, 4, 0 );
model.setValueAt( Statics.TOTAL_XP, 5, 0 );
model.setValueAt( Statics.XP_PER_MINUTE, 6, 0 );
model.setValueAt( Statics.DEATHS, 7, 0 );
getPlayerBox().addActionListener( new ActionListener() {
@Override
public void actionPerformed( ActionEvent e ) {
final String id = (String) getPlayerBox().getSelectedItem();
final Player p = appState.getPlayerByName( id );
if (p != null) {
final long ms = appState.getGameLength();
final double minutes = ms / 60000.0;
final String team = p.isRadiant() ? Statics.RADIANT : Statics.DIRE;
final Hero hero = p.getHero();
final String name = hero != null ? hero.getName() : Statics.UNKNOWN_HERO;
final int gold = p.getTotalEarnedGold();
final double gpm = gold / minutes;
final int toalXp = p.getTotalXP();
final double xpm = toalXp / minutes;
final int deaths = p.getDeaths().size();
model.setValueAt( p.getName(), 0, 1 );
model.setValueAt( team, 1, 1 );
model.setValueAt( name, 2, 1 );
model.setValueAt( TWO_DIGITS.format( gold ), 3, 1 );
model.setValueAt( TWO_DIGITS.format( gpm ), 4, 1 );
model.setValueAt( TWO_DIGITS.format( toalXp ), 5, 1 );
model.setValueAt( TWO_DIGITS.format( xpm ), 6, 1 );
model.setValueAt( TWO_DIGITS.format( deaths ), 7, 1 );
}
}
} );
table.setBorder( BorderFactory.createEmptyBorder( 5, 5, 5, 5 ) );
return table;
}
private Component createRightComponent() {
final JTabbedPane rightPane = new JTabbedPane();
rightPane.addTab( "Statistics", createPlayerStatisticsTab() );
rightPane.addTab( "Build Order", createPlayerBuildOrderTab() );
rightPane.addTab( "Skill Tree", createPlayerSkillTreeTab() );
rightPane.setBorder( BorderFactory.createEmptyBorder( 5, 5, 5, 5 ) );
return rightPane;
}
public JComboBox<String> getPlayerBox() {
if (playerBox == null) {
playerBox = new JComboBox<String>() {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* @inherited <p>
*/
@Override
public Dimension getMaximumSize() {
final Dimension max = super.getMaximumSize();
max.height = getPreferredSize().height;
return max;
}
};
playerBox.setAlignmentX( Component.CENTER_ALIGNMENT );
}
return playerBox;
}
}