001// Copyright 2006 by Basil Vandegriend.  All rights reserved.
002
003package com.basilv.examples.enums;
004
005import java.util.*;
006
007import javax.swing.table.AbstractTableModel;
008
009public class PersonTableModel extends AbstractTableModel
010{
011
012  /**
013   * Represents a column of the table.
014   */
015  static enum Column {
016    FIRST_NAME("First Name") {
017      @Override public Object getValue(Person person) {
018        return person.getFirstName();
019      }
020
021      @Override public int getWidthInCharacters() {
022        return 10;
023      }
024    },
025
026    LAST_NAME("Last Name") {
027      @Override public Object getValue(Person person) {
028        return person.getLastName();
029      }
030
031      @Override public int getWidthInCharacters() {
032        return 20;
033      }
034    },
035
036    AGE("Age") {
037      @Override public Object getValue(Person person) {
038        return person.getAge();
039      }
040
041      @SuppressWarnings("unchecked") @Override public Class getColumnClass() {
042        return Integer.class;
043      }
044
045      @Override public int getWidthInCharacters() {
046        return 5;
047      }
048    },
049
050    BIRTHDAY("Birthday") {
051      @Override public Object getValue(Person person) {
052        return person.getBirthDay();
053      }
054
055      @SuppressWarnings("unchecked") @Override public Class getColumnClass() {
056        return Date.class;
057      }
058
059      @Override public int getWidthInCharacters() {
060        return 12;
061      }
062    };
063
064    
065    private String displayName;
066
067    private Column(String displayName) {
068      assert displayName != null
069        && displayName.length() > 0;
070      this.displayName = displayName;
071    }
072
073    public String getDisplayName() {
074      return displayName;
075    }
076
077    /**
078     * Return the value for this column for the specified
079     * person.
080     */
081    public abstract Object getValue(Person person);
082
083    /**
084     * Return the class of Object returned by this column.
085     */
086    @SuppressWarnings("unchecked") public Class getColumnClass() {
087      return String.class; // Default value
088    }
089
090    /**
091     * Return the number of characters needed to display the
092     * header and data for this column.
093     */
094    public abstract int getWidthInCharacters();
095  }
096
097  private List<Person> personList = new ArrayList<Person>();
098
099  public void setPersonList(List<Person> list) {
100    assert list != null;
101    personList.clear();
102    personList.addAll(list);
103    fireTableDataChanged();
104  }
105
106  public int getColumnCount() {
107    return Column.values().length;
108  }
109
110  public int getRowCount() {
111    return personList.size();
112  }
113
114  public Object getValueAt(int rowIndex, int columnIndex) {
115    Person person = getPerson(rowIndex);
116    Column column = getColumn(columnIndex);
117    return column.getValue(person);
118  }
119
120  @Override public String getColumnName(int columnIndex) {
121    return getColumn(columnIndex).getDisplayName();
122  }
123
124  @Override public Class<?> getColumnClass(int columnIndex) {
125    Column column = getColumn(columnIndex);
126    return column.getColumnClass();
127  }
128
129  Person getPerson(int rowIndex) {
130    return personList.get(rowIndex);
131  }
132
133  private Column getColumn(int columnIndex) {
134    return Column.values()[columnIndex];
135  }
136
137}