package org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.deliverydate;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.jdo.FetchPlan;
import org.eclipse.swt.widgets.Shell;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.store.DeliveryNote;
import org.nightlabs.jfire.store.dao.DeliveryNoteDAO;
import org.nightlabs.jfire.store.id.DeliveryNoteID;
import org.nightlabs.jfire.trade.Article;
import org.nightlabs.jfire.trade.ArticleContainer;
import org.nightlabs.jfire.trade.Offer;
import org.nightlabs.jfire.trade.Order;
import org.nightlabs.jfire.trade.dao.OfferDAO;
import org.nightlabs.jfire.trade.deliverydate.DeliveryDateMode;
import org.nightlabs.jfire.trade.id.OfferID;
import org.nightlabs.jfire.trade.ui.articlecontainer.detail.ArticleSelection;
import org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.GenericArticleEditAction;
import org.nightlabs.progress.NullProgressMonitor;
/**
* @author Daniel Mazurek - daniel [at] nightlabs [dot] de
*
*/
public class EditDeliveryDateAction
extends GenericArticleEditAction
{
@Override
public boolean calculateEnabled(Set<ArticleSelection> articleSelections)
{
// TODO check why this method must be called, because otherwise getArticles() in run() is null
super.calculateEnabled(articleSelections);
ArticleContainer ac = getArticleContainer();
// check if ArticleContainer is Offer or Order
if (ac instanceof Offer || ac instanceof Order) {
// should be enabled only, if there's no finalized offer involved!
Set<OfferID> offerIDs = new HashSet<OfferID>();
for (ArticleSelection articleSelection : articleSelections)
{
for (Article article : articleSelection.getSelectedArticles())
offerIDs.add(article.getOfferID());
}
Collection<Offer> offers = OfferDAO.sharedInstance().getOffers(offerIDs, new String[] { FetchPlan.DEFAULT },
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new NullProgressMonitor());
for (Offer offer : offers) {
if (offer.isFinalized())
return false;
}
if (getArticles() != null)
return true;
}
// check if ArticleContainer is DeliveryNote
else if (ac instanceof DeliveryNote) {
// should be enabled only, if there's no finalized deliveryNote involved!
Set<DeliveryNoteID> deliveryNoteIDs = new HashSet<DeliveryNoteID>();
for (ArticleSelection articleSelection : articleSelections)
{
for (Article article : articleSelection.getSelectedArticles())
deliveryNoteIDs.add(article.getDeliveryNoteID());
}
Collection<DeliveryNote> deliveryNotes = DeliveryNoteDAO.sharedInstance().getDeliveryNotes(deliveryNoteIDs,
new String[] { FetchPlan.DEFAULT }, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new NullProgressMonitor());
for (DeliveryNote deliveryNote : deliveryNotes) {
if (deliveryNote.isFinalized())
return false;
}
if (getArticles() != null)
return true;
}
return false;
}
@Override
public boolean calculateVisible()
{
return true;
}
/* (non-Javadoc)
* @see org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.GenericArticleEditAction#excludeArticle(org.nightlabs.jfire.trade.Article)
*/
@Override
protected boolean excludeArticle(Article article)
{
return false;
}
@Override
public void run()
{
Shell shell = getArticleContainerEdit().getComposite().getShell();
EditDeliveryDateDialog dialog = new EditDeliveryDateDialog(shell, getArticles(), getMode());
dialog.open();
}
private DeliveryDateMode getMode()
{
if (getArticleContainer() instanceof DeliveryNote) {
return DeliveryDateMode.DELIVERY_NOTE;
}
else {
return DeliveryDateMode.OFFER;
}
}
}