/*
* SkillPointTableModel.java
* Copyright 2010 Connor Petty <cpmeister@users.sourceforge.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Created on Jul 6, 2010, 1:30:26 PM
*/
package pcgen.gui2.tabs.skill;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import pcgen.facade.core.CharacterFacade;
import pcgen.facade.core.CharacterLevelFacade;
import pcgen.facade.core.CharacterLevelsFacade;
import pcgen.facade.core.CharacterLevelsFacade.CharacterLevelEvent;
import pcgen.facade.core.CharacterLevelsFacade.ClassListener;
import pcgen.facade.core.CharacterLevelsFacade.SkillPointListener;
import pcgen.facade.util.event.ListEvent;
import pcgen.facade.util.event.ListListener;
import pcgen.gui2.tabs.Utilities;
import pcgen.gui2.util.FontManipulation;
import pcgen.gui2.util.table.TableCellUtilities;
/**
* A model to back the table of character levels and the skill points
* associated with them.
*
* @author Connor Petty <cpmeister@users.sourceforge.net>
*/
public class SkillPointTableModel extends AbstractTableModel
implements ListListener<CharacterLevelFacade>, ClassListener, SkillPointListener
{
private CharacterLevelsFacade levels;
public SkillPointTableModel(CharacterFacade character)
{
this.levels = character.getCharacterLevelsFacade();
levels.addListListener(this);
levels.addClassListener(this);
levels.addSkillPointListener(this);
}
public static void initializeTable(JTable table)
{
table.setAutoCreateColumnsFromModel(false);
JTableHeader header = table.getTableHeader();
TableColumnModel columns = new DefaultTableColumnModel();
TableCellRenderer headerRenderer = header.getDefaultRenderer();
columns.addColumn(Utilities.createTableColumn(0, "in_level", headerRenderer, false));
columns.addColumn(Utilities.createTableColumn(1, "in_class", headerRenderer, true));
TableColumn remainCol = Utilities.createTableColumn(2, "in_iskRemain", headerRenderer, false);
remainCol.setCellRenderer(new BoldNumberRenderer());
columns.addColumn(remainCol);
columns.addColumn(Utilities.createTableColumn(3, "in_gained", headerRenderer, false));
table.setDefaultRenderer(Integer.class,
new TableCellUtilities.AlignRenderer(SwingConstants.CENTER));
table.setColumnModel(columns);
table.setFocusable(false);
header.setReorderingAllowed(false);
header.setResizingAllowed(false);
}
@Override
public int getRowCount()
{
return levels.getSize();
}
@Override
public int getColumnCount()
{
return 4;
}
@Override
public Class<?> getColumnClass(int columnIndex)
{
switch (columnIndex)
{
case 1:
return Object.class;
case 0:
case 2:
case 3:
return Integer.class;
default:
return Object.class;
}
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
if (columnIndex == 0)
{
return rowIndex + 1;
}
CharacterLevelFacade level = levels.getElementAt(rowIndex);
switch (columnIndex)
{
case 1:
return levels.getClassTaken(level);
case 2:
return levels.getRemainingSkillPoints(level);
case 3:
return levels.getGainedSkillPoints(level);
default:
throw new IndexOutOfBoundsException();
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex)
{
if (columnIndex == 3)
{
return true;
}
return false;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
{
CharacterLevelFacade level = levels.getElementAt(rowIndex);
levels.setGainedSkillPoints(level, (Integer) aValue);
}
@Override
public void elementAdded(ListEvent<CharacterLevelFacade> e)
{
fireTableRowsInserted(e.getIndex(), e.getIndex());
}
@Override
public void elementRemoved(ListEvent<CharacterLevelFacade> e)
{
fireTableRowsDeleted(e.getIndex(), e.getIndex());
}
@Override
public void elementsChanged(ListEvent<CharacterLevelFacade> e)
{
fireTableDataChanged();
}
@Override
public void elementModified(ListEvent<CharacterLevelFacade> e)
{
fireTableRowsUpdated(e.getIndex(), e.getIndex());
}
@Override
public void skillPointsChanged(CharacterLevelEvent e)
{
levelChanged(e);
}
@Override
public void classChanged(CharacterLevelEvent e)
{
levelChanged(e);
}
private void levelChanged(CharacterLevelEvent e)
{
int firstRow = e.getBaseLevelIndex();
int lastRow = e.affectsHigherLevels() ? levels.getSize() - 1 : firstRow;
fireTableRowsUpdated(firstRow, lastRow);
}
/**
* The Class {@code BoldNumberRenderer} displays a right aligned
* read-only column containing a bolded number.
*/
private static class BoldNumberRenderer extends DefaultTableCellRenderer
{
/**
* Create a new BoldNumberRenderer instance.
*/
public BoldNumberRenderer()
{
setHorizontalAlignment(SwingConstants.CENTER);
}
/* (non-Javadoc)
* @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
*/
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
comp.setFont(FontManipulation.bold(table.getFont()));
return this;
}
}
}