package org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.nightlabs.base.ui.resource.SharedImages;
import org.nightlabs.base.ui.table.AbstractTableComposite;
import org.nightlabs.base.ui.table.TableLabelProvider;
import org.nightlabs.jfire.accounting.Invoice;
import org.nightlabs.jfire.store.DeliveryNote;
import org.nightlabs.jfire.trade.Article;
import org.nightlabs.jfire.trade.ArticleContainer;
import org.nightlabs.jfire.trade.ArticleContainerUtil;
import org.nightlabs.jfire.trade.Offer;
import org.nightlabs.jfire.trade.Order;
import org.nightlabs.jfire.trade.deliverydate.ArticleContainerDeliveryDateDTO;
import org.nightlabs.jfire.trade.id.ArticleID;
import org.nightlabs.jfire.trade.ui.TradePlugin;
import org.nightlabs.jfire.trade.ui.resource.Messages;
import org.nightlabs.l10n.DateFormatter;
/**
* @author Daniel Mazurek - daniel [at] nightlabs [dot] de
*
*/
public class DeliveryDateTable extends AbstractTableComposite<ArticleContainer>
{
class LabelProvider extends TableLabelProvider
{
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
*/
@Override
public String getColumnText(Object element, int columnIndex)
{
if (element != null && element instanceof ArticleContainerDeliveryDateDTO) {
ArticleContainerDeliveryDateDTO dto = (ArticleContainerDeliveryDateDTO) element;
ArticleContainer ac = dto.getArticleContainer();
switch(columnIndex) {
case 0:
return ""; //$NON-NLS-1$
case 1:
return ArticleContainerUtil.getArticleContainerID(ac);
case 2:
return ac.getCustomer().getPerson().getDisplayName();
case 3:
Set<String> endCustomers = new HashSet<String>();
// Collection<Article> articles = ac.getArticles();
Collection<Article> articles = dto.getArticleID2Article().values();
for (Article article : articles) {
if (article.getEndCustomer() != null){
String endCustomer = article.getEndCustomer().getPerson().getDisplayName();;
endCustomers.add(endCustomer);
}
}
StringBuilder sb = new StringBuilder();
int counter = 0;
for (String endCustomer : endCustomers) {
if (counter != 0)
sb.append("/"); //$NON-NLS-1$
sb.append(endCustomer);
++counter;
}
return sb.toString();
case 4:
Set<Date> deliveryDates = new HashSet<Date>();
// articles = ac.getArticles();
articles = dto.getArticleID2Article().values();
if (ac instanceof Offer || ac instanceof Order) {
for (Article article : articles) {
if (article.getDeliveryDateOffer() != null)
deliveryDates.add(article.getDeliveryDateOffer());
}
}
else if (ac instanceof DeliveryNote) {
for (Article article : articles) {
if (article.getDeliveryDateDeliveryNote() != null)
deliveryDates.add(article.getDeliveryDateDeliveryNote());
}
}
List<Date> dates = new ArrayList<Date>(deliveryDates);
Collections.sort(dates);
sb = new StringBuilder();
counter = 0;
for (Date deliveryDate : dates) {
if (counter != 0)
sb.append("/"); //$NON-NLS-1$
sb.append(DateFormatter.formatDateShort(deliveryDate, true));
++counter;
}
return sb.toString();
}
}
return null;
}
/* (non-Javadoc)
* @see org.nightlabs.base.ui.table.TableLabelProvider#getColumnImage(java.lang.Object, int)
*/
@Override
public Image getColumnImage(Object element, int columnIndex) {
if (element != null && element instanceof ArticleContainerDeliveryDateDTO) {
ArticleContainerDeliveryDateDTO dto= (ArticleContainerDeliveryDateDTO) element;
ArticleContainer ac = dto.getArticleContainer();
switch(columnIndex) {
case 0:
String suffix = null;
if (ac instanceof Offer) {
suffix = "Offer"; //$NON-NLS-1$
}
else if (ac instanceof Order) {
suffix = "Order"; //$NON-NLS-1$
}
else if (ac instanceof DeliveryNote) {
suffix = "DeliveryNote"; //$NON-NLS-1$
}
else if (ac instanceof Invoice) {
suffix = "Invoice"; //$NON-NLS-1$
}
return SharedImages.getSharedImage(TradePlugin.getDefault(), DeliveryDateTable.class, suffix);
}
}
return null;
}
}
/**
* @param parent
* @param style
*/
public DeliveryDateTable(Composite parent, int style) {
super(parent, style);
}
/* (non-Javadoc)
* @see org.nightlabs.base.ui.table.AbstractTableComposite#createTableColumns(org.eclipse.jface.viewers.TableViewer, org.eclipse.swt.widgets.Table)
*/
@Override
protected void createTableColumns(TableViewer tableViewer, Table table)
{
TableColumn iconColumn = new TableColumn(table, SWT.NONE);
// iconColumn.setText("Icon");
TableColumn idColumn = new TableColumn(table, SWT.NONE);
idColumn.setText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateTable.column.id.name")); //$NON-NLS-1$
TableColumn customerColumn = new TableColumn(table, SWT.NONE);
customerColumn.setText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateTable.column.customer.name")); //$NON-NLS-1$
TableColumn endCustomerColumn = new TableColumn(table, SWT.NONE);
endCustomerColumn.setText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateTable.column.endcustomer.name")); //$NON-NLS-1$
TableColumn deliveryDateColumn = new TableColumn(table, SWT.NONE);
deliveryDateColumn.setText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateTable.column.deliverydate.name")); //$NON-NLS-1$
TableLayout tableLayout = new TableLayout();
tableLayout.addColumnData(new ColumnPixelData(20));
tableLayout.addColumnData(new ColumnPixelData(75));
tableLayout.addColumnData(new ColumnWeightData(1));
tableLayout.addColumnData(new ColumnWeightData(1));
tableLayout.addColumnData(new ColumnWeightData(1));
table.setLayout(tableLayout);
}
/* (non-Javadoc)
* @see org.nightlabs.base.ui.table.AbstractTableComposite#setTableProvider(org.eclipse.jface.viewers.TableViewer)
*/
@Override
protected void setTableProvider(TableViewer tableViewer) {
tableViewer.setContentProvider(new ArrayContentProvider());
tableViewer.setLabelProvider(new LabelProvider());
tableViewer.setSorter(new ViewerSorter() {
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public int compare(Viewer viewer, Object e1, Object e2)
{
if (e1 instanceof ArticleContainerDeliveryDateDTO && e2 instanceof ArticleContainerDeliveryDateDTO) {
ArticleContainerDeliveryDateDTO a1 = (ArticleContainerDeliveryDateDTO) e1;
ArticleContainerDeliveryDateDTO a2 = (ArticleContainerDeliveryDateDTO) e2;
Date a1DeliveryDate = getEarliestDeliveryDate(a1);
Date a2DeliveryDate = getEarliestDeliveryDate(a2);
if (a1DeliveryDate == null && a2DeliveryDate == null)
return 0;
else if (a1DeliveryDate == null && a2DeliveryDate != null)
return -1;
else if (a1DeliveryDate != null && a2DeliveryDate == null)
return 1;
else
return a1DeliveryDate.compareTo(a2DeliveryDate);
}
return super.compare(viewer, e1, e2);
}
});
}
public Date getEarliestDeliveryDate(ArticleContainerDeliveryDateDTO dto) {
Date deliveryDate = null;
for (Map.Entry<ArticleID, Article> entry : dto.getArticleID2Article().entrySet()) {
Article article = entry.getValue();
Date articleDeliveryDate = null;
if (dto.getArticleContainer() instanceof Offer) {
articleDeliveryDate = article.getDeliveryDateOffer();
}
else if (dto.getArticleContainer() instanceof DeliveryNote) {
articleDeliveryDate = article.getDeliveryDateDeliveryNote();
}
if (deliveryDate == null && articleDeliveryDate != null) {
deliveryDate = articleDeliveryDate;
}
else if (deliveryDate.compareTo(articleDeliveryDate) > 0) {
deliveryDate = articleDeliveryDate;
}
}
return deliveryDate;
}
}