package org.jtheque.films.view.impl.models.table;
/*
* Copyright JTheque (Baptiste Wicht)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.jtheque.core.managers.Managers;
import org.jtheque.core.managers.beans.IBeansManager;
import org.jtheque.core.managers.log.ILoggingManager;
import org.jtheque.core.managers.persistence.able.DataListener;
import org.jtheque.core.managers.persistence.able.Entity;
import org.jtheque.films.persistence.dao.able.IDaoFilms;
import org.jtheque.primary.od.able.Lending;
import org.jtheque.primary.od.able.Person;
import org.jtheque.primary.services.able.ILendingsService;
import org.jtheque.utils.bean.IntDate;
import org.jtheque.utils.collections.CollectionUtils;
import javax.annotation.Resource;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import java.util.List;
/**
* A table model to display lendings of film.
*
* @author Baptiste Wicht
*/
public final class LendingsTableModel extends AbstractTableModel implements TableModelListener, DataListener {
private static final long serialVersionUID = 1L;
/**
* The columns of the table.
*
* @author Baptiste Wicht
*/
private interface Columns {
int ID = 0;
int FILM = 1;
int BORROWER = 2;
int DATE = 3;
}
private String[] headers;
private List<Lending> lendings;
@Resource
private ILendingsService lendingsService;
@Resource
private IDaoFilms daoFilms;
/**
* Construct a new <code>LendingsTableModel</code>.
*/
public LendingsTableModel() {
super();
addTableModelListener(this);
Managers.getManager(IBeansManager.class).inject(this);
lendingsService.addDataListener(this);
lendings = CollectionUtils.copyOf(lendingsService.getLendings());
}
/**
* Set the headers of the table.
*
* @param headers The headers of the table.
*/
public void setHeader(String[] headers) {
this.headers = headers.clone();
fireTableStructureChanged();
}
@Override
public int getColumnCount() {
return headers.length;
}
@Override
public int getRowCount() {
return lendingsService.getLendings().size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object value;
switch (columnIndex) {
case Columns.ID:
value = lendings.get(rowIndex).getId();
break;
case Columns.FILM:
value = daoFilms.getFilm(lendings.get(rowIndex).getTheOther());
break;
case Columns.BORROWER:
value = lendings.get(rowIndex).getThePerson();
break;
case Columns.DATE:
value = lendings.get(rowIndex).getDate();
break;
default:
value = "";
break;
}
return value;
}
@Override
public void setValueAt(Object value, int column, int row) {
if (value != null) {
Lending lending = lendingsService.getLending(row);
switch (column) {
case Columns.FILM:
lending.setTheOther(((Entity) value).getId());
break;
case Columns.BORROWER:
lending.setThePerson((Person) value);
break;
case Columns.DATE:
lending.setDate(new IntDate((Integer) value));
break;
default:
Managers.getManager(ILoggingManager.class).getLogger(getClass()).debug("Anormal entry in switch clause. ");
break;
}
fireTableCellUpdated(column, row);
}
}
@Override
public String getColumnName(int column) {
return headers[column];
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
@Override
public void tableChanged(TableModelEvent event) {
if (event.getType() == TableModelEvent.UPDATE &&
event.getColumn() != -1 &&
event.getFirstRow() == event.getLastRow()) {
lendingsService.save(lendingsService.getLending(event.getFirstRow()));
}
}
@Override
public void dataChanged() {
lendings = CollectionUtils.copyOf(lendingsService.getLendings());
fireTableDataChanged();
}
}