package hu.sch.web.wicket.components.tables; import hu.sch.domain.ValuationData; import hu.sch.services.MembershipManagerLocal; import java.io.Serializable; import java.util.*; import javax.inject.Inject; import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; /** * Értékelési táblázat, amely {@link ValuationData}-kat tud megjeleníteni. A * fontosabb oszlopok alapján rendezhető, de ezt a konkrét implementáció dönti * el. * * @author messo * @since 2.3.1 * @see AjaxFallbackDefaultDataTable * @see ValuationData */ public abstract class ValuationTable implements Serializable { AjaxFallbackDefaultDataTable<ValuationData, String> table; MySortableDataProvider provider; @Inject protected MembershipManagerLocal membershipManager; protected boolean isShowSvieColumn = false; protected ValuationTable() { } /** * Konstruktor, amely létrehozza a táblázatot a megfelelő oszlopokkal és * adatokkal * * @param id a Wicket ID-ja annak a table-nek, ahova be akarjuk majd szúrni * a táblázatot * @param items a lista, amit a táblázatban meg akarunk jeleníteni * @param rowsPerPage egy oldalon hány elem jelenjne meg? * @param showSvieColumn megjelenjen-e a SVIE státusz oszlop */ public ValuationTable(final String id, final List<ValuationData> items, final int rowsPerPage, final boolean showSvieColumn) { provider = new MySortableDataProvider(items); this.isShowSvieColumn = showSvieColumn; final List<IColumn<ValuationData, String>> columns = new ArrayList<IColumn<ValuationData, String>>(5); populateColumns(columns); table = new AjaxFallbackDefaultDataTable<ValuationData, String>(id, columns, provider, rowsPerPage); } protected abstract void populateColumns(List<IColumn<ValuationData, String>> columns); public AjaxFallbackDefaultDataTable<ValuationData, String> getDataTable() { return table; } /** * Frissítjük a listát. * * @param list az új lista, amit a táblázatban szerepeltetni szeretnénk */ public void updateList(List<ValuationData> list) { provider.items = list; } static class MySortableDataProvider extends SortableDataProvider<ValuationData, String> { private List<ValuationData> items; public static final String SORT_BY_USER = "user"; public static final String SORT_BY_POINT = "point"; public static final String SORT_BY_ENTRANT = "entrant"; public static final String SORT_BY_SEMESTER = "semester"; public static final String SORT_BY_GROUP = "group"; public MySortableDataProvider(List<ValuationData> items) { this.items = items; } @Override public Iterator<ValuationData> iterator(long first, long count) { // Nagy adathalmaznál jobb lenne DB-be rendezni, de ez olyan // kismértékű adat, hogy nem számottevő ráadásul a lista nem a // DB-ből jön közvetlenül, így nehéz is lenne megoldani ;) sort(); return items.subList((int) first, (int) (first + count)).iterator(); } @Override public long size() { return items.size(); } @Override public IModel<ValuationData> model(ValuationData valData) { return new LoadableDetachableModel<ValuationData>(valData) { @Override protected ValuationData load() { return new ValuationData(null, null, null); } }; } private void sort() { String prop = getSort().getProperty(); final int asc = getSort().isAscending() ? 1 : -1; if (prop == null) { return; } if (prop.equals(SORT_BY_USER)) { Collections.sort(items, new Comparator<ValuationData>() { @Override public int compare(ValuationData v1, ValuationData v2) { return asc * v1.getUser().compareTo(v2.getUser()); } }); } else if (prop.equals(SORT_BY_POINT)) { Collections.sort(items, new Comparator<ValuationData>() { @Override public int compare(ValuationData v1, ValuationData v2) { return asc * v1.getPointRequest().getPoint().compareTo(v2.getPointRequest().getPoint()); } }); } else if (prop.equals(SORT_BY_ENTRANT)) { Collections.sort(items, new Comparator<ValuationData>() { @Override public int compare(ValuationData v1, ValuationData v2) { return asc * v1.getEntrantRequest().getEntrantType().compareTo(v2.getEntrantRequest().getEntrantType()); } }); } else if (prop.equals(SORT_BY_SEMESTER)) { Collections.sort(items, new Comparator<ValuationData>() { @Override public int compare(ValuationData v1, ValuationData v2) { return asc * v1.getSemester().compareTo(v2.getSemester()); } }); } else if (prop.equals(SORT_BY_GROUP)) { Collections.sort(items, new Comparator<ValuationData>() { @Override public int compare(ValuationData v1, ValuationData v2) { return asc * v1.getGroup().compareTo(v2.getGroup()); } }); } } } }