/* *****************************************************************************
* JFire - it's hot - Free ERP System - http://jfire.org *
* Copyright (C) 2004-2005 NightLabs - http://NightLabs.org *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2.1 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin St, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
* Or get it online : *
* http://opensource.org/licenses/lgpl-license.php *
* *
* *
******************************************************************************/
package org.nightlabs.jfire.voucher.ui.articlecontainer.detail;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.nightlabs.base.ui.layout.WeightedTableLayout;
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.ArticlePrice;
import org.nightlabs.jfire.trade.Offer;
import org.nightlabs.jfire.trade.Order;
import org.nightlabs.jfire.trade.ui.TradePlugin;
import org.nightlabs.jfire.trade.ui.articlecontainer.detail.AllocationStatusImageUtil;
import org.nightlabs.jfire.trade.ui.articlecontainer.detail.ArticleChangeEvent;
import org.nightlabs.jfire.trade.ui.articlecontainer.detail.ArticleChangeListener;
import org.nightlabs.jfire.trade.ui.articlecontainer.detail.ClientArticleSegmentGroupSet;
import org.nightlabs.jfire.voucher.store.Voucher;
import org.nightlabs.jfire.voucher.store.VoucherKey;
import org.nightlabs.jfire.voucher.store.VoucherType;
import org.nightlabs.jfire.voucher.ui.detail.VoucherKeyDetailComposite;
import org.nightlabs.jfire.voucher.ui.resource.Messages;
import org.nightlabs.l10n.NumberFormatter;
import org.nightlabs.util.NLLocale;
/**
* @author Marco Schulze - marco at nightlabs dot de
*/
public class ArticleTable
extends AbstractTableComposite<Article>
implements ISelectionProvider
{
protected static class ArticleContentProvider
implements IStructuredContentProvider
{
private ArticleEdit articleEdit;
public ArticleContentProvider(ArticleEdit articleEdit)
{
this.articleEdit = articleEdit;
}
public Object[] getElements(Object inputElement)
{
return articleEdit.getArticles().toArray();
}
public void dispose()
{
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
}
}
private static String getValidity(VoucherKey voucherKey)
{
return
VoucherKeyDetailComposite.getValidity(voucherKey) +
(VoucherKey.VALIDITY_REDEEMED_COMPLETELY != voucherKey.getValidity() && voucherKey.isRedemptionExisting() ? (' '+Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.validitySuffix_partiallyRedeemed")) : ""); //$NON-NLS-1$ //$NON-NLS-2$
}
protected class ArticleLabelProvider
extends TableLabelProvider
{
@Override
public Image getColumnImage(Object element, int columnIndex)
{
if (! (element instanceof Article))
return null;
Article article = (Article) element;
int ci = 0;
if (ci == columnIndex)
return null; // name
if (++ci == columnIndex)
return null; // voucherKey
if (++ci == columnIndex)
return null; // validity
if (++ci == columnIndex) {
return AllocationStatusImageUtil.getAllocationStatusImage(
article,
articleEdit.getSegmentEdit().getArticleContainer());
}
if (!isInOrder() && !isInOffer()) {
if (++ci == columnIndex)
return TradePlugin.getDefault().getImageRegistry().get(TradePlugin.IMAGE_ORDER_16x16);
}
if (!isInOffer()) {
if (++ci == columnIndex)
return TradePlugin.getDefault().getImageRegistry().get(TradePlugin.IMAGE_OFFER_16x16);
}
if (!isInInvoice()) {
if (++ci == columnIndex && article.getInvoiceID() != null)
return TradePlugin.getDefault().getImageRegistry().get(TradePlugin.IMAGE_INVOICE_16x16);
if (++ci == columnIndex && article.getArticleLocal().isInvoicePaid())
return TradePlugin.getDefault().getImageRegistry().get(TradePlugin.IMAGE_ARTICLE_PAID_16x16);
}
if (!isInDeliveryNote()) {
if (++ci == columnIndex && article.getDeliveryNoteID() != null)
return TradePlugin.getDefault().getImageRegistry().get(TradePlugin.IMAGE_DELIVERY_NOTE_16x16);
}
if (++ci == columnIndex && article.getArticleLocal().isDelivered())
return TradePlugin.getDefault().getImageRegistry().get(TradePlugin.IMAGE_ARTICLE_DELIVERED_16x16);
return null;
}
public String getColumnText(Object element, int columnIndex)
{
if (! (element instanceof Article))
return "Invalid element! Must be Article, but is " + (element == null ? "null" : element.getClass().getName()); //$NON-NLS-1$ //$NON-NLS-2$
Article article = (Article) element;
if (! (article.getProductType() instanceof VoucherType))
return "article.productType is an instance of " + (article.getProductType() == null ? "null" : article.getProductType().getClass().getName()) + ", but must be a VoucherType!"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
VoucherType simpleProductType = (VoucherType) article.getProductType();
Voucher voucher = (Voucher) article.getProduct();
int ci = 0;
if (ci == columnIndex)
return simpleProductType.getName().getText(NLLocale.getDefault().getLanguage());
if (++ci == columnIndex)
return voucher == null ? "" : voucher.getVoucherKey() == null ? "" : voucher.getVoucherKey().getVoucherKey(); //$NON-NLS-1$ //$NON-NLS-2$
if (++ci == columnIndex)
return voucher == null ? "" : voucher.getVoucherKey() == null ? "" : getValidity(voucher.getVoucherKey()); //$NON-NLS-1$ //$NON-NLS-2$
if (++ci == columnIndex) {
return ""; // allocationStatus is displayed using images //$NON-NLS-1$
}
if (!isInOrder() && !isInOffer()) {
if (++ci == columnIndex)
return ""; // Long.toString(article.getOrderID().orderID); //$NON-NLS-1$
}
if (!isInOffer()) {
if (++ci == columnIndex)
return ""; // Long.toString(article.getOfferID().offerID); //$NON-NLS-1$
}
if (!isInInvoice()) {
if (++ci == columnIndex)
return ""; // Long.toString(article.getInvoiceID().invoiceID); //$NON-NLS-1$
if (++ci == columnIndex)
return ""; // invoice's paid status //$NON-NLS-1$
}
if (!isInDeliveryNote()) {
if (++ci == columnIndex)
return ""; // Long.toString(article.getDeliveryNoteID().deliveryNoteID); //$NON-NLS-1$
}
if (++ci == columnIndex)
return ""; // Article's delivered status //$NON-NLS-1$
if (++ci == columnIndex) {
ArticlePrice price = article.getPrice();
return NumberFormatter.formatCurrency(price.getAmount(), price.getCurrency());
}
return ""; //$NON-NLS-1$
}
}
private ArticleEdit articleEdit;
private ArticleContentProvider articleContentProvider;
private ArticleLabelProvider articleLabelProvider;
private ClientArticleSegmentGroupSet clientArticleSegmentGroupSet;
/**
* @param parent
* @param style
* @param initTable
*/
public ArticleTable(Composite parent, int style, ArticleEdit articleEdit)
{
super(parent, style, false);
this.articleEdit = articleEdit;
this.articleContentProvider = new ArticleContentProvider(articleEdit);
this.articleLabelProvider = new ArticleLabelProvider();
initTable();
setHeaderVisible(true);
clientArticleSegmentGroupSet = ((ClientArticleSegmentGroupSet)articleEdit.getSegmentEdit().getArticleSegmentGroup().getArticleSegmentGroupSet());
clientArticleSegmentGroupSet.addArticleChangeListener(articleChangeListener);
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
clientArticleSegmentGroupSet.removeArticleChangeListener(articleChangeListener);
}
});
}
private ArticleChangeListener articleChangeListener = new ArticleChangeListener() {
public void articlesChanged(ArticleChangeEvent articleChangeEvent) {
if (getTableViewer() != null && !getTable().isDisposed())
refresh();
}
};
@Override
protected void createTableColumns(TableViewer tableViewer, Table table)
{
TableColumn col = new TableColumn(table, SWT.LEFT);
col.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.nameTableColumn.text")); //$NON-NLS-1$
col.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.nameTableColumn.text")); //$NON-NLS-1$
col = new TableColumn(table, SWT.LEFT);
col.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.keyTableColumn.text")); //$NON-NLS-1$
col.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.keyTableColumn.text")); //$NON-NLS-1$
col = new TableColumn(table, SWT.LEFT);
col.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.validityTableColumn.text")); //$NON-NLS-1$
col.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.validityTableColumn.text")); //$NON-NLS-1$
col = new TableColumn(table, SWT.LEFT);
col.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.allocationStatusTableColumn.text")); //$NON-NLS-1$
col.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.allocationStatusTableColumn.text")); //$NON-NLS-1$
//////////// BEGIN Order, Offer, Invoice, DeliveryNote //////////
if (!isInOrder() && !isInOffer()) {
col = new TableColumn(table, SWT.LEFT);
col.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.orderTableColumn.text")); //$NON-NLS-1$
col.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.orderTableColumn.text")); //$NON-NLS-1$
}
if (!isInOffer()) {
col = new TableColumn(table, SWT.LEFT);
col.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.offerTableColumn.text")); //$NON-NLS-1$
col.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.offerTableColumn.text")); //$NON-NLS-1$
}
if (!isInInvoice()) {
col = new TableColumn(table, SWT.LEFT);
col.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.invoiceTableColumn.text")); //$NON-NLS-1$
col.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.invoiceTableColumn.text")); //$NON-NLS-1$
col = new TableColumn(table, SWT.LEFT);
col.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.paidColumn.text")); //$NON-NLS-1$
col.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.paidColumn.toolTip.text")); //$NON-NLS-1$
}
if (!isInDeliveryNote()) {
col = new TableColumn(table, SWT.LEFT);
col.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.deliveryNoteTableColumn.text")); //$NON-NLS-1$
col.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.deliveryNoteTableColumn.text")); //$NON-NLS-1$
}
col = new TableColumn(table, SWT.LEFT);
col.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.deliveredColumn.text")); //$NON-NLS-1$
col.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.deliveredColumn.toolTip")); //$NON-NLS-1$
//////////// END Order, Offer, Invoice, DeliveryNote //////////
TableColumn columnPrice = new TableColumn(table, SWT.RIGHT);
columnPrice.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.priceTableColumn.text")); //$NON-NLS-1$
columnPrice.setToolTipText(Messages.getString("org.nightlabs.jfire.voucher.ui.articlecontainer.detail.ArticleTable.priceTableColumn.text")); //$NON-NLS-1$
if (isInOrder()) // name, allocationStatus, offer, invoice, deliveryNote, price
table.setLayout(
new WeightedTableLayout(
new int[]{80, 40, 40, -1, -1, -1, -1, -1, -1, 30},
new int[]{-1, -1, -1, 22, 22, 22, 22, 22, 22, -1}));
else if (isInOffer()) // name, allocationStatus, invoice, deliveryNote, price
table.setLayout(
new WeightedTableLayout(
new int[]{80, 40, 40, -1, -1, -1, -1, -1, 30},
new int[]{-1, -1, -1, 22, 22, 22, 22, 22, -1}));
else if (isInInvoice())
table.setLayout(
new WeightedTableLayout(
new int[]{80, 40, 40, -1, -1, -1, -1, -1, 30},
new int[]{-1, -1, -1, 22, 22, 22, 22, 22, -1}));
else if (isInDeliveryNote())
table.setLayout(
new WeightedTableLayout(
new int[]{80, 40, 40, -1, -1, -1, -1, -1, -1, 30},
new int[]{-1, -1, -1, 22, 22, 22, 22, 22, 22, -1}));
else
throw new UnsupportedOperationException("Unknown ArticleContainer!"); //$NON-NLS-1$
}
@Override
protected void setTableProvider(TableViewer tableViewer)
{
tableViewer.setContentProvider(articleContentProvider);
tableViewer.setLabelProvider(articleLabelProvider);
// tableViewer.setComparator(new ViewerSorter(Collator.getInstance(NLLocale.getDefault())));
// sort by article id
tableViewer.setComparator(new ViewerComparator() {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
if (e1 instanceof Article && e2 instanceof Article)
return new Long(((Article) e1).getArticleID()).compareTo(((Article) e2).getArticleID());
return super.compare(viewer, e1, e2);
}
});
}
@Override
public void setMenu(Menu menu)
{
super.setMenu(menu);
Control[] children = getChildren();
for (int i = 0; i < children.length; ++i) {
children[i].setMenu(menu);
}
}
private boolean isInOrder()
{
return articleEdit.getSegmentEdit().getArticleContainer() instanceof Order;
}
private boolean isInOffer()
{
return articleEdit.getSegmentEdit().getArticleContainer() instanceof Offer;
}
private boolean isInInvoice()
{
return articleEdit.getSegmentEdit().getArticleContainer() instanceof Invoice;
}
private boolean isInDeliveryNote()
{
return articleEdit.getSegmentEdit().getArticleContainer() instanceof DeliveryNote;
}
}