/*
* © 2008 3kraft
* $Id: MetaDataTableModel.java,v 1.16 2010-12-13 10:24:09 illetsch Exp $
*/
package com.dreikraft.axbo.model;
import com.dreikraft.events.ApplicationEventDispatcher;
import com.dreikraft.axbo.data.SleepData;
import com.dreikraft.axbo.events.SleepDataSave;
import com.dreikraft.axbo.util.BundleUtil;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.regex.Pattern;
import javax.swing.table.AbstractTableModel;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* $Id: MetaDataTableModel.java,v 1.16 2010-12-13 10:24:09 illetsch Exp $
*
* @author 3kraft - $Author: illetsch $
* @version $Revision: 1.16 $
*/
public class MetaDataTableModel extends AbstractTableModel {
// global constants
public static final Log log = LogFactory.getLog(MetaDataTableModel.class);
// Column Headings
enum Column {
DATE("date", Date.class),
ID("id", String.class),
NAME("name", String.class),
COMMENT("comment", String.class);
private static final String HEADING_KEY_PREFIX =
"metaDataTable.columnheading.";
private String headingKey;
private Class<?> type;
private Column(final String headingKey, final Class<?> type) {
this.headingKey = headingKey;
this.type = type;
}
public String getLocalizedColumnHeading() {
return BundleUtil.getMessage(HEADING_KEY_PREFIX + headingKey);
}
public Class<?> getType() {
return type;
}
}
private List<SleepData> data = new ArrayList<SleepData>();
private List<SleepData> filteredData = new ArrayList<SleepData>();
public MetaDataTableModel() {
this.data = new ArrayList<SleepData>();
filteredData = new ArrayList<SleepData>();
}
@Override
public String getColumnName(int col) {
return Column.values()[col].getLocalizedColumnHeading();
}
@Override
public int getRowCount() {
return filteredData.size();
}
@Override
public int getColumnCount() {
return Column.values().length;
}
@Override
public Object getValueAt(int row, int col) {
Object val = null;
switch (col) {
case 0:
val = filteredData.get(row).calculateStartTime();
break;
case 1:
val = filteredData.get(row).getId();
break;
case 2:
val = filteredData.get(row).getName();
break;
case 3:
val = filteredData.get(row).getComment();
break;
default:
}
return val;
}
@Override
public Class<?> getColumnClass(int col) {
return Column.values()[col].getType();
}
public SleepData getSleepDataAt(int row) {
return filteredData.get(row);
}
public void filterData(final String name, final Date dateFrom, Date dateUntil) {
final boolean searchName = (name != null && name.trim().length() > 0);
final boolean searchDateFrom = (dateFrom != null);
final boolean searchDateUntil = (dateUntil != null);
// add 1 day to date until
if (searchDateUntil) {
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(dateUntil);
cal.add(Calendar.DATE, 1);
dateUntil = cal.getTime();
}
// are the search fields not all empty
if (searchName || searchDateFrom || searchDateUntil) {
filteredData = new ArrayList<SleepData>(data.size());
for (SleepData record : data) {
final String recName =
(record.getName() != null ? record.getName() : "");
final boolean matchesName = Pattern.compile("^.*" + name + ".*$",
Pattern.CASE_INSENSITIVE).matcher(recName).matches();
@SuppressWarnings({"null", "ConstantConditions"})
final boolean matchesDateFrom = (searchDateFrom && dateFrom.before(
record.
calculateStartTime()));
@SuppressWarnings({"null", "ConstantConditions"})
final boolean matchesDateUntil = (searchDateUntil && dateUntil.after(
record.
calculateStartTime()));
if ((matchesName || !searchName) && (matchesDateFrom || !searchDateFrom)
&& (matchesDateUntil
|| !searchDateUntil)) {
filteredData.add(record);
}
}
} else {
filteredData = data;
}
// notify the TableSorter that the Tabel has changed
this.fireTableDataChanged();
}
public List<SleepData> getData() {
return data;
}
public void addSleepData(SleepData sleepData) {
data.add(sleepData);
filteredData.add(sleepData);
this.fireTableDataChanged();
}
public void removeSleepData(SleepData sleepData) {
data.remove(sleepData);
filteredData.remove(sleepData);
this.fireTableDataChanged();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 2 || columnIndex == 3;
}
@Override
public void setValueAt(final Object aValue, int rowIndex, int columnIndex) {
final SleepData sleepData = getSleepDataAt(rowIndex);
if (columnIndex == 2) {
sleepData.setName((String) aValue);
}
if (columnIndex == 3) {
sleepData.setComment((String) aValue);
}
ApplicationEventDispatcher.getInstance().dispatchGUIEvent(new SleepDataSave(
this, sleepData));
}
}