package pathfinder.gui.general;
import generic.DocumentTypeConstant;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import net.alteiar.campaign.CampaignAdapter;
import net.alteiar.campaign.CampaignClient;
import net.alteiar.component.MyCombobox;
import net.alteiar.documents.BeanBasicDocument;
import net.alteiar.documents.BeanDocument;
import pathfinder.bean.unit.PathfinderCharacter;
import pathfinder.gui.adapter.CharacterAdapter;
public class PanelCharacterInfo extends JPanel implements
PropertyChangeListener {
private static final long serialVersionUID = 1L;
private BeanDocument characterDocument;
private final JTextField textFieldAc;
private final JTextField textFieldAcFlatFooted;
private final JTextField textFieldAcTouch;
private final JLabel labelInit;
private final HealthBar healthBar;
private final MyCombobox<CharacterAdapter> comboBox;
private class HealthBar extends JPanel {
private static final long serialVersionUID = 1L;
private Integer totalHp;
private Integer currentHp;
public HealthBar(Integer total, Integer current) {
this.totalHp = total;
this.currentHp = current;
this.setPreferredSize(new Dimension(180, 20));
}
public void setCurrentHp(Integer currentHp) {
this.currentHp = currentHp;
this.revalidate();
this.repaint();
}
public void setTotalHp(Integer totalHp) {
this.totalHp = totalHp;
this.revalidate();
this.repaint();
}
@Override
public void paint(Graphics g) {
int xLife = 0;
int yLife = 0;
int widthLife = 180;
int heightLife = 20;
Float ratio = Math.min(1.0f, currentHp / (float) totalHp);
if (currentHp > 0) {
Color hp = new Color(1.0f - ratio, ratio, 0);
g.setColor(hp);
g.fillRect(xLife, yLife, (int) (widthLife * ratio), heightLife);
}
g.setColor(Color.BLACK);
g.drawRect(xLife, yLife, widthLife - 1, heightLife - 1);
g.drawString(currentHp + "/" + totalHp, 80, 15);
}
}
private Boolean isCharacter(BeanDocument doc) {
return doc.getDocumentType().equals(DocumentTypeConstant.CHARACTER);
}
public void addCharacter(final BeanDocument doc) {
if (isCharacter(doc)) {
CharacterAdapter adapter = new CharacterAdapter(doc);
comboBox.addItem(adapter);
if (comboBox.getItemCount() < 2) {
comboBox.setSelectedItem(adapter);
comboboxChange();
}
}
}
public void removeCharacter(BeanDocument doc) {
if (isCharacter(doc)) {
comboBox.removeItem(new CharacterAdapter(doc));
}
}
public PanelCharacterInfo() {
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[] { 0, 0, 0 };
gridBagLayout.rowHeights = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
gridBagLayout.columnWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE };
gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, Double.MIN_VALUE };
setLayout(gridBagLayout);
comboBox = new MyCombobox<CharacterAdapter>(
CharacterAdapter.getCharacters());
CampaignClient.getInstance().addCampaignListener(new CampaignAdapter() {
@Override
public void beanAdded(BeanBasicDocument bean) {
if (!bean.isDirectory()) {
addCharacter((BeanDocument) bean);
}
}
@Override
public void beanRemoved(BeanBasicDocument bean) {
if (!bean.isDirectory()) {
removeCharacter((BeanDocument) bean);
}
}
});
comboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
comboboxChange();
}
});
JLabel lblNom = new JLabel("Nom:");
GridBagConstraints gbc_lblNom = new GridBagConstraints();
gbc_lblNom.anchor = GridBagConstraints.EAST;
gbc_lblNom.insets = new Insets(0, 0, 5, 5);
gbc_lblNom.gridx = 0;
gbc_lblNom.gridy = 1;
add(lblNom, gbc_lblNom);
// textFieldName = new JTextField();
// textFieldName.setEditable(false);
GridBagConstraints gbc_textFieldName = new GridBagConstraints();
gbc_textFieldName.insets = new Insets(0, 0, 5, 0);
gbc_textFieldName.fill = GridBagConstraints.HORIZONTAL;
gbc_textFieldName.gridx = 1;
gbc_textFieldName.gridy = 1;
add(comboBox, gbc_textFieldName);
// textFieldName.setColumns(20);
labelInit = new JLabel("PV:");
GridBagConstraints gbc_labelInit = new GridBagConstraints();
gbc_labelInit.anchor = GridBagConstraints.EAST;
gbc_labelInit.insets = new Insets(0, 0, 5, 5);
gbc_labelInit.gridx = 0;
gbc_labelInit.gridy = 2;
add(labelInit, gbc_labelInit);
healthBar = new HealthBar(0, 0);
GridBagConstraints gbc_textFieldInit = new GridBagConstraints();
gbc_textFieldInit.insets = new Insets(0, 0, 5, 0);
gbc_textFieldInit.fill = GridBagConstraints.HORIZONTAL;
gbc_textFieldInit.gridx = 1;
gbc_textFieldInit.gridy = 2;
add(healthBar, gbc_textFieldInit);
JLabel lblCa = new JLabel("CA:");
GridBagConstraints gbc_lblCa = new GridBagConstraints();
gbc_lblCa.anchor = GridBagConstraints.EAST;
gbc_lblCa.insets = new Insets(0, 0, 5, 5);
gbc_lblCa.gridx = 0;
gbc_lblCa.gridy = 4;
add(lblCa, gbc_lblCa);
textFieldAc = new JTextField();
textFieldAc.setEditable(false);
GridBagConstraints gbc_textFieldCa = new GridBagConstraints();
gbc_textFieldCa.insets = new Insets(0, 0, 5, 0);
gbc_textFieldCa.fill = GridBagConstraints.HORIZONTAL;
gbc_textFieldCa.gridx = 1;
gbc_textFieldCa.gridy = 4;
add(textFieldAc, gbc_textFieldCa);
textFieldAc.setColumns(10);
JLabel lblCaDpourvu = new JLabel("CA D\u00E9pourvu:");
GridBagConstraints gbc_lblCaDpourvu = new GridBagConstraints();
gbc_lblCaDpourvu.anchor = GridBagConstraints.EAST;
gbc_lblCaDpourvu.insets = new Insets(0, 0, 5, 5);
gbc_lblCaDpourvu.gridx = 0;
gbc_lblCaDpourvu.gridy = 5;
add(lblCaDpourvu, gbc_lblCaDpourvu);
textFieldAcFlatFooted = new JTextField();
textFieldAcFlatFooted.setEditable(false);
GridBagConstraints gbc_textFieldCaFlatFooted = new GridBagConstraints();
gbc_textFieldCaFlatFooted.insets = new Insets(0, 0, 5, 0);
gbc_textFieldCaFlatFooted.fill = GridBagConstraints.HORIZONTAL;
gbc_textFieldCaFlatFooted.gridx = 1;
gbc_textFieldCaFlatFooted.gridy = 5;
add(textFieldAcFlatFooted, gbc_textFieldCaFlatFooted);
textFieldAcFlatFooted.setColumns(10);
JLabel lblCaContact = new JLabel("CA Contact:");
GridBagConstraints gbc_lblCaContact = new GridBagConstraints();
gbc_lblCaContact.insets = new Insets(0, 0, 0, 5);
gbc_lblCaContact.anchor = GridBagConstraints.EAST;
gbc_lblCaContact.gridx = 0;
gbc_lblCaContact.gridy = 6;
add(lblCaContact, gbc_lblCaContact);
textFieldAcTouch = new JTextField();
textFieldAcTouch.setEditable(false);
GridBagConstraints gbc_textFieldCaTouch = new GridBagConstraints();
gbc_textFieldCaTouch.fill = GridBagConstraints.HORIZONTAL;
gbc_textFieldCaTouch.gridx = 1;
gbc_textFieldCaTouch.gridy = 6;
add(textFieldAcTouch, gbc_textFieldCaTouch);
textFieldAcTouch.setColumns(10);
comboboxChange();
}
private void comboboxChange() {
if (this.characterDocument != null) {
this.characterDocument.getBean().removePropertyChangeListener(this);
}
if (comboBox.getItemCount() > 0 && comboBox.getSelectedItem() != null) {
characterDocument = comboBox.getSelectedItem().getCharacter();
this.characterDocument.getBean().addPropertyChangeListener(this);
updateCharacterView();
}
}
private PathfinderCharacter getCharacter() {
return CampaignClient.getInstance().getBean(
characterDocument.getBeanId());
}
public void updateCharacterView() {
PathfinderCharacter character = getCharacter();
if (character != null) {
this.healthBar.setCurrentHp(character.getCurrentHp());
this.healthBar.setTotalHp(character.getTotalHp());
this.textFieldAc.setText(character.getAc().toString());
this.textFieldAcFlatFooted.setText(character.getAcFlatFooted()
.toString());
this.textFieldAcTouch.setText(character.getAcTouch().toString());
this.revalidate();
this.repaint();
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
updateCharacterView();
}
}