package GUI;
import java.util.Vector;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import GUI.SelectionListeners.TableCustomerListSelectionHandler;
import GUI.SelectionListeners.TableVideoListSelectionHandler;
import GUI.TableModels.NotEditableTableModel;
import model.Customer;
import model.Video;
import model.data.exceptions.RecordNotFoundException;
import model.events.EventManager;
import model.events.SearchEvent;
import model.events.VideothekEvent;
import model.events.VideothekEventListener;
/**
*
* @author Waldemar Smirnow
* @author Volha Baranouskaya
*/
public class SearchController implements VideothekEventListener
{
private TablePanel tablePanel;
private String currentSearchTerm;
/**
* Erstellt einen Suchcontroller (registriert sich als EventListener)
* @param tablePanel worauf der Suchcontroller gelten soll
*/
public SearchController(TablePanel tablePanel)
{
this.tablePanel = tablePanel;
EventManager.registerEventListener(SearchEvent.class, this);
}
/**
* verwaltet die empfangenen Events
*/
@Override
public void handleEvent(VideothekEvent event)
{
if(event instanceof SearchEvent)
{
SearchEvent searchEvent = (SearchEvent) event;
this.currentSearchTerm = searchEvent.getSearchTerm();
if(searchEvent.getSearchType().equals(SearchEvent.SearchType.COSTUMER))
{
this.tablePanel.setSearchTableActive();
this.tablePanel.setCustomerSearchTableActive();
fillCustomerTableContent();
}
else if(searchEvent.getSearchType().equals(SearchEvent.SearchType.VIDEO))
{
this.tablePanel.setSearchTableActive();
this.tablePanel.setVideoSearchTableActive();
fillVideoTableContent();
}
}
}
/**
* füllt die Kundentabelle mit den gefundenen Daten
*/
private void fillCustomerTableContent()
{
Vector rowData = getCustomerRows(this.currentSearchTerm);
Vector columns = getCustomerColumns();
this.tablePanel.getTableSearchCustomer().setModel(new javax.swing.table.DefaultTableModel(
rowData, columns)
{
public boolean isCellEditable(int row, int column) {
return false;
}
});
this.tablePanel.getTableSearchCustomer().getModel().addTableModelListener(
new TableModelListener()
{
@Override
public void tableChanged(TableModelEvent e)
{
fillCustomerTableContent();
}
});
this.tablePanel.getTableSearchCustomer().getSelectionModel().addListSelectionListener(
new TableCustomerListSelectionHandler(MainWindow.get(),
this.tablePanel.getTableSearchCustomer()));
TableColumnModel colModel = this.tablePanel.getTableSearchCustomer().getColumnModel();
colModel.getColumn(0).setPreferredWidth(80);
colModel.getColumn(1).setPreferredWidth(100);
colModel.getColumn(2).setPreferredWidth(250);
colModel.getColumn(3).setPreferredWidth(250);
colModel.getColumn(4).setPreferredWidth(100);
colModel.getColumn(5).setPreferredWidth(450);
this.tablePanel.getTableSearchCustomer().getTableHeader().setReorderingAllowed(false);
}
/**
* Liefert Kunden Spaltennamen
* @return Kunden Spaltennamen
*/
private Vector getCustomerColumns()
{
Vector columns = new Vector();
columns.add("KundenNr.");
columns.add("Anrede");
columns.add("Nachname");
columns.add("Vorname");
columns.add("Geburtsdatum");
columns.add("Anschrift");
return columns;
}
/**
* Liefert Vektor mit den gesuchten Kundenelementen für die Tabelle
* @param searchTerm gesuchter Kunde
* @return Vector mit den gefundenen Daten
*/
private Vector getCustomerRows(String searchTerm)
{
Vector rows = new Vector();
for(Customer c : Customer.findByLastName(searchTerm))
{
Vector row = new Vector();
row.add(c.getID());
row.add(c.getTitle());
row.add(c.getLastName());
row.add(c.getFirstName());
row.add(c.getBirthDate());
row.add(c.getFirstAddressRow() + ", " + c.getLastAddressRow());
rows.add(row);
}
return rows;
}
/**
* erstellt die Filmtabelle
*/
private void fillVideoTableContent()
{
Vector rowData = getVideoRows(this.currentSearchTerm);
Vector columns = getVideoColumns();
this.tablePanel.getTableSearchVideo().setModel(new DefaultTableModel(
rowData, columns)
{
public boolean isCellEditable(int row, int column) {
return false;
}
});
this.tablePanel.getTableSearchVideo().getModel().addTableModelListener(
new TableModelListener()
{
@Override
public void tableChanged(TableModelEvent e)
{
fillVideoTableContent();
}
});
this.tablePanel.getTableSearchVideo().getSelectionModel().addListSelectionListener(
new TableVideoListSelectionHandler(MainWindow.get(),
tablePanel.getTableSearchVideo()));
TableColumnModel colModel = this.tablePanel.getTableSearchVideo().getColumnModel();
colModel.getColumn(0).setPreferredWidth(80);
colModel.getColumn(1).setPreferredWidth(350);
colModel.getColumn(2).setPreferredWidth(80);
colModel.getColumn(3).setPreferredWidth(100);
colModel.getColumn(4).setPreferredWidth(80);
this.tablePanel.getTableSearchVideo().getTableHeader().setReorderingAllowed(false);
}
/**
* Liefert Film Spaltennamen
* @return Vector mit Film Spaltennamen
*/
private Vector getVideoColumns()
{
Vector columns = new Vector();
columns.add("FilmNr.");
columns.add("Titel");
columns.add("Erscheinungsjahr");
columns.add("Preisklasse");
columns.add("FSK.");
return columns;
}
/**
* Liefert einen Vector mit gefundenen Filmen
* @param searchTerm gesuchter Titel
* @return Vector
*/
private Vector getVideoRows(String searchTerm)
{
Vector rows = new Vector();
for (Video v : Video.findByTitle(searchTerm))
{
Vector row = new Vector();
row.add(v.getID());
row.add(v.getTitle());
row.add(v.getReleaseYear());
try
{
row.add(v.getPriceCategory().getName());
}
catch (RecordNotFoundException e)
{
row.add("keine preiskategorie");
}
row.add(v.getRatedAge());
rows.add(row);
}
return rows;
}
}