package de.achim.turnier.tabellen;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import de.achim.turnier.Turniervewaltung2;
import de.achim.turnier.utility.ITabellen;
import de.achim.turnier.utility.MannschaftErgebnis;
public class TabellenPanel extends JPanel implements ITabellen{
private static final int WIDTH = 400;
private static final int HEIGHT = 80;
private int gruppe = 1;
private MannschaftErgebnis me;
TableRowSorter sorter;
private String[] columnNames = {"Mannschaft",
"Spiele",
"Tore +",
"Tore -",
"Tordifferenz",
"Punkte",
"sortiertab"};
/*private String[] cols = new String[3];
private Object[] data = {"", new Integer(5),
new Integer(0),
new Integer(0),
new Integer(0),
new Integer(0),
new Integer(0)};*/
DefaultTableModel dataModel = new DefaultTableModel();
private JTable table;
private JPanel motherPanel;
private JLabel title;
public TabellenPanel(){
title = new JLabel();
Font font = new Font( Font.SANS_SERIF, Font.PLAIN, 20 );
title.setFont(font);
title.setHorizontalAlignment(title.CENTER);
dataModel.setColumnIdentifiers(columnNames);
sorter = new TableRowSorter(dataModel);
sorter.setSortable(0, false);
sorter.setSortable(1, false);
sorter.setSortable(2, false);
sorter.setSortable(3, false);
sorter.setSortable(4, false);
sorter.setSortable(5, false);
sorter.setSortable(6, true);
List <RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
//sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
sortKeys.add(new RowSorter.SortKey(6, SortOrder.DESCENDING));
sorter.setSortKeys(sortKeys);
sorter.setComparator(6, new PunkteComparator());
table = new JTable(dataModel);
table.setRowSorter(sorter);
setLayout(new BorderLayout());
JButton druckButton = new JButton("Drucken");
ActionListener al = new PrintTable(this);
druckButton.addActionListener(al);
add(title, BorderLayout.NORTH);
add(table.getTableHeader(), BorderLayout.PAGE_START);
add(table, BorderLayout.CENTER);
add(druckButton, BorderLayout.SOUTH);
}
public JTable getTable() {
return table;
}
public JLabel getTitle() {
return this.title;
}
public void setTitle(String title) {
if(this.title.getText().length() <= 0){
this.title.setText(title);
revalidate();
}
}
public void addRow(MannschaftErgebnis me){
this.me = me;
if(!checkExistance(me)){
Integer toreDiff = me.getManschaftTorePlus() - me.getMannschaftToreMinus();
Object[] rowData = {me.getMannschaftName(),
new Integer(1), //ist das erste Spiel der Mannschaft
me.getManschaftTorePlus(),
me.getMannschaftToreMinus(),
toreDiff,
me.getMannschaftPunkte(),
calcSortValue(me.getMannschaftPunkte(), toreDiff, me.getManschaftTorePlus())};
dataModel.addRow(rowData);
}
table.getColumn(table.getColumnModel().getColumn(6).getIdentifier()).setPreferredWidth(-1);
table.getColumn(table.getColumnModel().getColumn(6).getIdentifier()).setMaxWidth(-1);
dataModel.fireTableChanged(new TableModelEvent(dataModel));
dataModel.fireTableDataChanged();
revalidate();
}
public void initFromFile(Vector<String> vLine){
Iterator<String> iter = vLine.iterator();
while(iter.hasNext()){
String s = iter.next();
initFromLine(s);
}
}
public void initFromLine(String s){
StringTokenizer st = new StringTokenizer(s, ";");
MannschaftErgebnis me = new MannschaftErgebnis(st.nextToken());
me.setMannschaftSpiele(new Integer(st.nextToken()));
me.setManschaftTorePlus(new Integer(st.nextToken()));
me.setMannschaftToreMinus(new Integer(st.nextToken()));
st.nextToken();
me.setMannschaftPunkte(new Integer(st.nextToken()));
addRow(me);
}
public JPanel getMotherPanel() {
return this.motherPanel;
}
public void setMotherPanel(JPanel motherPanel) {
this.motherPanel = motherPanel;
}
public String toString(){
StringBuffer sb = new StringBuffer();
int rc = table.getRowCount();
int cc = table.getColumnCount();
for(int row = 0; row < rc; row++){
for(int column = 0; column < cc-1; column++ ){
sb.append(table.getValueAt(row, column)).append(";");
}
sb.append(gruppe);
sb.append("\n");
}
return sb.toString();
}
/**
* testen ob mannschaft schon in der Tabelle eingetragen wurde
*
*/
private boolean checkExistance(MannschaftErgebnis me){
boolean vorhanden = false;
int rowcount = dataModel.getRowCount();
// der Name steht in der ersten Spalte
int manschaftname = 0;
for(int row = 0; row<rowcount;row++){
String name = ((String)dataModel.getValueAt(row, manschaftname)).trim();
if(name.equals(me.getMannschaftName())){
updateRow(me, row);
return true;
}
}
table.getColumn(table.getColumnModel().getColumn(6).getIdentifier()).setPreferredWidth(-1);
table.getColumn(table.getColumnModel().getColumn(6).getIdentifier()).setMaxWidth(-1);
dataModel.fireTableChanged(new TableModelEvent(dataModel));
dataModel.fireTableDataChanged();
return vorhanden;
}
/**
* vorhandenen Eintrag aktualisieren
*/
private void updateRow(MannschaftErgebnis me, int row){
/*
* new Integer(1),
me.getManschaftTorePlus(),
me.getMannschaftToreMinus(),
new Integer(me.getManschaftTorePlus() - me.getMannschaftToreMinus()),
me.getMannschaftPunkte()
*/
Integer spiele = (Integer) dataModel.getValueAt(row, 1);
Integer torePlus = (Integer) dataModel.getValueAt(row, 2);
Integer toreMinus = (Integer) dataModel.getValueAt(row, 3);
Integer toreDiff = (Integer) dataModel.getValueAt(row, 4);
Integer punkte = (Integer) dataModel.getValueAt(row, 5);
// Integer sortValue = (Integer) dataModel.getValueAt(row, 6);
spiele = spiele + 1;
torePlus = torePlus + me.getManschaftTorePlus();
toreMinus = toreMinus + me.getMannschaftToreMinus();
toreDiff = torePlus - toreMinus;
punkte = punkte + me.getMannschaftPunkte();
Integer sortValue = calcSortValue(punkte, toreDiff, torePlus);
dataModel.setValueAt(spiele, row, 1);
dataModel.setValueAt(torePlus, row, 2);
dataModel.setValueAt(toreMinus, row, 3);
dataModel.setValueAt(toreDiff, row, 4);
dataModel.setValueAt(punkte, row, 5);
dataModel.setValueAt(sortValue, row, 6);
}
private Integer calcSortValue(Integer punkte, Integer torediff, Integer toreplus){
Integer gewichtPunkte = 10000;
Integer gewichtDiff = 100;
Integer gewichtTorepLus = 1;
Integer summe = gewichtPunkte * punkte;
summe = summe + (gewichtDiff * torediff);
summe = summe + (gewichtTorepLus * toreplus);
return summe;
}
/**
* @return the gruppe
*/
public int getGruppe() {
return this.gruppe;
}
/**
* @param gruppe the gruppe to set
*/
public void setGruppe(int gruppe) {
this.gruppe = gruppe;
}
}
class PrintTable implements ActionListener {
TabellenPanel tp;
public PrintTable (TabellenPanel t){
this.tp = t;
}
@Override
public void actionPerformed(ActionEvent e) {
((Turniervewaltung2)((TabellenContainer)tp.getMotherPanel()).getMotherFrame()).printData(tp);
}
}