package org.pegadi.disposal;
import org.pegadi.model.*;
import org.pegadi.server.NoAccessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.table.AbstractTableModel;
import java.util.*;
public class PageTableModel extends AbstractTableModel {
private String[] columnNames;
private List<DispPage> pages;
private Disp disp;
ResourceBundle messages;
private final Logger log = LoggerFactory.getLogger(getClass());
public PageTableModel(Disp disp) {
messages = ResourceBundle.getBundle("org.pegadi.publicationcontrol.PublicationControlStrings");
columnNames = new String[]{ messages.getString("dispcol_page"),
messages.getString("dispcol_section"),
messages.getString("dispcol_articles"),
messages.getString("dispcol_notes"),
messages.getString("dispcol_journalists"),
messages.getString("dispcol_photo"),
messages.getString("dispcol_status"),
messages.getString("dispcol_photostatus"),
messages.getString("dispcol_ad")};
this.disp = disp;
loadPages();
}
public int getRowCount() {
return pages.size();
}
public int getColumnCount() {
return columnNames.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int rowIndex, int columnIndex) {
DispPage page = getPage(rowIndex);
switch (columnIndex) {
case 0: return page.getPageNumber();
case 1: return page.getSection();
case 3: return page.getText();
case 2: case 4: case 5: return listStuff(page, columnIndex);
case 6: return listStatus(page);
case 7: return page.getPhotoStatus();
case 8: return page.isAdOnPage();
default: return null;
}
}
public DispPage getPage(int rowIndex) {
return pages.get(rowIndex);
}
public Class getColumnClass(int column) {
switch (column) {
case 0: return Integer.class;
case 1: return DispSection.class;
case 8: return Boolean.class;
default: return String.class;
}
}
public boolean isCellEditable(int row, int col) {
switch(col) {
case 1: case 3: case 7: case 8: return true;
default: return false;
}
}
public void setValueAt(Object value, int row, int col) {
DispPage page = pages.get(row);
// 2=artikler, 3=journalister, 4=fotografer, 5=statuser
switch (col) {
case 1: page.setSection((DispSection) value); break;
case 3: page.setText((String) value); break;
case 7: page.setPhotoSatus((String) value); break;
case 8: page.setAdOnPage((Boolean) value);
}
try {
LoginContext.server.saveDispPage(page, LoginContext.sessionKey);
} catch (NoAccessException e) {
log.error("error - cannot save disppage", e);
}
fireTableDataChanged();
}
public void createNewPage() {
try {
DispPage newPage = LoginContext.server.createDispPage(new DispPage(disp.getId(), pages.size()+1), LoginContext.sessionKey);
pages.add(newPage);
} catch (NoAccessException e) {
log.error("error - failed getting new page from server", e);
}
fireTableDataChanged();
}
public void deletePage(int index) {
DispPage page = pages.get(index);
try {
LoginContext.server.deleteDispPage(page, LoginContext.sessionKey);
pages.remove(index);
for(; index < pages.size(); index++) {
DispPage currPage = pages.get(index);
currPage.setPageNumber(currPage.getPageNumber()-1);
}
LoginContext.server.saveDispPages(pages, LoginContext.sessionKey);
} catch (NoAccessException e) {
log.error("error - failed deleting page", e);
}
fireTableDataChanged();
}
public boolean movePage(int fromIndex, int toIndex) {
/* Have to do different calculations based on the page being moved up or down */
/* down */
if(fromIndex - toIndex < 0) {
if(fromIndex - toIndex == -1)
return false;
pages.get(fromIndex).setPageNumber(toIndex);
for(int i = fromIndex + 1; i < toIndex; i++) {
DispPage currPage = pages.get(i);
currPage.setPageNumber(currPage.getPageNumber() - 1);
}
}
/* up */
else {
if(fromIndex - toIndex == 0)
return false;
pages.get(fromIndex).setPageNumber(toIndex + 1);
for(int i = toIndex; i < fromIndex; i++) {
DispPage currPage = pages.get(i);
currPage.setPageNumber(currPage.getPageNumber() + 1);
}
}
try {
LoginContext.server.saveDispPages(pages, LoginContext.sessionKey);
} catch (NoAccessException e) {
log.error("error - failed saving page", e);
}
resort();
fireTableDataChanged();
return true;
}
private void resort() {
Collections.sort(pages, new Comparator<DispPage>() {
public int compare(DispPage o1, DispPage o2) {
return o1.getPageNumber() - o2.getPageNumber();
}
});
}
private void loadPages() {
try {
pages = LoginContext.server.getPagesByDispId(disp.getId(), LoginContext.sessionKey);
} catch (NoAccessException e) {
log.error("error - failed loading pages", e);
}
}
public void refresh() {
loadPages();
fireTableDataChanged();
}
private String listStuff(DispPage page, int nr) {
String s = "";
for(int i = 0; i < page.getArticles().size(); i++) {
Article article = page.getArticles().get(i);
String b = "";
switch (nr) {
case 2: b = article.getName(); break;
case 4: b = article.getJournalist() != null ? article.getJournalist().getName() : ""; break;
case 5: b = article.getPhotographer() != null ? article.getPhotographer().getName() : ""; break;
//case 6: b = article.getArticleStatus().getName(); break;
}
if(i == 0) {
s += b;
} else {
s += " \n \n" + b;
}
}
return s;
}
private List<ArticleStatus> listStatus(DispPage page) {
List<ArticleStatus> list = new ArrayList<ArticleStatus>();
for(Article article : page.getArticles()) {
list.add(article.getArticleStatus());
}
return list;
}
}