package org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.changetariff;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.jdo.FetchPlan;
import javax.jdo.JDOHelper;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.base.ui.wizard.WizardHopPage;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.accounting.Tariff;
import org.nightlabs.jfire.accounting.gridpriceconfig.GridPriceConfig;
import org.nightlabs.jfire.accounting.id.TariffID;
import org.nightlabs.jfire.store.ProductType;
import org.nightlabs.jfire.trade.Article;
import org.nightlabs.jfire.trade.dao.ArticleDAO;
import org.nightlabs.jfire.trade.id.ArticleID;
import org.nightlabs.jfire.trade.ui.resource.Messages;
import org.nightlabs.jfire.trade.ui.tariff.TariffList;
import org.nightlabs.jfire.trade.ui.tariff.TariffList.TariffFilter;
import org.nightlabs.progress.NullProgressMonitor;
import org.nightlabs.progress.ProgressMonitor;
import org.nightlabs.util.Util;
public class ChangeTariffPage
extends WizardHopPage
{
private TariffList tariffList;
private Set<ArticleID> selectedArticleIDs;
public ChangeTariffPage(Set<ArticleID> selectedArticleIDs)
{
this(ChangeTariffPage.class.getName(), selectedArticleIDs);
}
public ChangeTariffPage(String pageName, Set<ArticleID> selectedArticleIDs)
{
super(pageName, Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.changetariff.ChangeTariffPage.title.changeTariff")); //$NON-NLS-1$
setDescription(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.changetariff.ChangeTariffPage.desciption.changeTariff")); //$NON-NLS-1$
assert selectedArticleIDs != null : "selectedArticleIDs != null"; //$NON-NLS-1$
this.selectedArticleIDs = selectedArticleIDs;
}
@Override
public Control createPageContents(Composite parent)
{
tariffList = new TariffList(parent, SWT.NONE, false);
tariffList.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event)
{
if (tariffList.getFirstSelectedElement() instanceof Tariff) {
selectedTariff = tariffList.getFirstSelectedElement();
getContainer().updateButtons();
}
}
});
tariffList.addDoubleClickListener(new IDoubleClickListener(){
@Override
public void doubleClick(DoubleClickEvent arg0) {
if (selectedTariff != null) {
if (getNextPage() == null) {
if (getWizard().canFinish()) {
getWizard().performFinish();
// close shell afterwards because getWizard().performFinish() does not close
getContainer().getShell().close();
}
}
}
}
});
// find out the articles' currently assigned tariffs and the available tariffs (in their assigned price configs)
// TODO we need to filter the tariffs according to the CustomerGroup as well - as soon as it defines available tariffs
Job loadArticlesJob = new Job(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.detail.action.changetariff.ChangeTariffPage.job.loadingArticles")) { //$NON-NLS-1$
@Override
protected IStatus run(ProgressMonitor monitor)
throws Exception
{
Collection<? extends Article> articles = ArticleDAO.sharedInstance().getArticles(
selectedArticleIDs,
new String[] {
FetchPlan.DEFAULT,
Article.FETCH_GROUP_TARIFF,
Article.FETCH_GROUP_PRODUCT_TYPE,
ProductType.FETCH_GROUP_PACKAGE_PRICE_CONFIG,
GridPriceConfig.FETCH_GROUP_TARIFFS
},
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
new NullProgressMonitor());
Set<GridPriceConfig> packagePriceConfigs = new HashSet<GridPriceConfig>();
for (Article article : articles)
packagePriceConfigs.add((GridPriceConfig) article.getProductType().getPackagePriceConfig());
// find out, if there is only one single tariff assigned currently (or if there are multiple) and if so, which one.
Tariff _currentlyAssignedTariff = null;
for (Article article : articles) {
if (_currentlyAssignedTariff == null)
_currentlyAssignedTariff = article.getTariff();
else if (!_currentlyAssignedTariff.equals(article.getTariff())) {
_currentlyAssignedTariff = null;
break;
}
}
// we need the currently assigned tariff to be final (because of async runnable)
final Tariff currentlyAssignedTariff = _currentlyAssignedTariff;
// find out the smallest set of TariffIDs that is available in all involved price configs
Set<TariffID> _availableTariffIDs = null;
for (GridPriceConfig priceConfig : packagePriceConfigs) {
if (_availableTariffIDs == null)
_availableTariffIDs = NLJDOHelper.getObjectIDSet(priceConfig.getTariffs());
else
_availableTariffIDs.retainAll(NLJDOHelper.getObjectIDSet(priceConfig.getTariffs()));
}
final Set<TariffID> availableTariffIDs = _availableTariffIDs;
final TariffFilter tariffFilter = new TariffFilter() {
@Override
public boolean includeTariff(Tariff tariff)
{
TariffID tariffID = (TariffID) JDOHelper.getObjectId(tariff);
return availableTariffIDs.contains(tariffID);
}
};
Display.getDefault().asyncExec(new Runnable()
{
public void run()
{
assignedTariff = currentlyAssignedTariff;
selectedTariff = currentlyAssignedTariff;
if (currentlyAssignedTariff != null)
tariffList.setSelectedElements(Collections.singletonList(currentlyAssignedTariff));
tariffList.loadTariffs(null, tariffFilter);
getContainer().updateButtons();
}
});
return Status.OK_STATUS;
}
};
loadArticlesJob.setPriority(org.eclipse.core.runtime.jobs.Job.INTERACTIVE);
loadArticlesJob.schedule();
return tariffList;
}
/**
* Will be <code>null</code> if there are multiple tariffs assigned to the different articles or the currently assigned tariff.
*/
private Tariff assignedTariff;
private Tariff selectedTariff;
@Override
public boolean isPageComplete()
{
return selectedTariff != null && !Util.equals(assignedTariff, selectedTariff);
}
public Tariff getSelectedTariff()
{
return selectedTariff;
}
}