package org.nightlabs.jfire.trade.ui.transfer.deliver;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.jdo.FetchPlan;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.nightlabs.base.ui.composite.FadeableComposite;
import org.nightlabs.base.ui.composite.XComboComposite;
import org.nightlabs.base.ui.composite.XComboComposite.CaptionOrientation;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.base.ui.notification.NotificationAdapterJob;
import org.nightlabs.base.ui.util.RCPUtil;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.base.jdo.notification.JDOLifecycleManager;
import org.nightlabs.jfire.base.ui.config.ConfigUtil;
import org.nightlabs.jfire.jdo.notification.DirtyObjectID;
import org.nightlabs.jfire.security.User;
import org.nightlabs.jfire.store.deliver.Delivery;
import org.nightlabs.jfire.store.deliver.DeliveryQueue;
import org.nightlabs.jfire.store.deliver.DeliveryQueueConfigModule;
import org.nightlabs.jfire.store.deliver.id.DeliveryQueueID;
import org.nightlabs.jfire.trade.Article;
import org.nightlabs.jfire.trade.LegalEntity;
import org.nightlabs.jfire.trade.ui.resource.Messages;
import org.nightlabs.jfire.trade.ui.transfer.wizard.DeliveryQueueDeliveryWizard;
import org.nightlabs.jfire.transfer.id.AnchorID;
import org.nightlabs.notification.NotificationListener;
import org.nightlabs.progress.NullProgressMonitor;
import org.nightlabs.progress.ProgressMonitor;
class DeliveryQueueBrowsingComposite
extends FadeableComposite
{
private XComboComposite<DeliveryQueue> printQueueCombo;
private DeliveryTable deliveryTable;
// private DeliveryQueueConfigModule deliveryQueueConfigModule;
private boolean refreshing = false;
private NotificationListener deliveryQueueLifecycleListener = new NotificationAdapterJob() {
public void notify(org.nightlabs.notification.NotificationEvent notificationEvent) {
for (Iterator<DirtyObjectID> it = notificationEvent.getSubjects().iterator(); it.hasNext(); ) {
DirtyObjectID dirtyObjectID = it.next();
Set<DeliveryQueueID> objectIds = NLJDOHelper.getObjectIDSet(printQueueCombo.getElements());
if (!objectIds.contains(dirtyObjectID.getObjectID())) {
return;
}
switch (dirtyObjectID.getLifecycleState()) {
case DIRTY:
refreshDeliveryQueues();
break;
}
}
}
};
public DeliveryQueueBrowsingComposite(Composite parent, int style) {
super(parent, style, LayoutMode.TIGHT_WRAPPER);
printQueueCombo = new XComboComposite<DeliveryQueue>(this, SWT.READ_ONLY, Messages.getString("org.nightlabs.jfire.trade.ui.transfer.deliver.DeliveryQueueBrowsingComposite.combo.label"), new LabelProvider() { //$NON-NLS-1$
@Override
public String getText(Object element) {
if (element instanceof DeliveryQueue) {
DeliveryQueue printQueue = (DeliveryQueue) element;
return printQueue.getName().getText();
}
return super.getText(element);
}
}, CaptionOrientation.LEFT);
printQueueCombo.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
deliveryTable.setInput(printQueueCombo.getSelectedElement().getPendingDeliveries());
}
});
deliveryTable = new DeliveryTable(this, SWT.NONE);
MenuManager popupMenu = new MenuManager();
IAction checkAllAction = new Action() {
@Override
public void run() {
checkAllDeliveries();
}
};
checkAllAction.setText(Messages.getString("org.nightlabs.jfire.trade.ui.transfer.deliver.DeliveryQueueBrowsingComposite.button.checkAllDeliveries")); //$NON-NLS-1$
IAction uncheckAllAction = new Action() {
@Override
public void run() {
uncheckAllDeliveries();
}
};
uncheckAllAction.setText(Messages.getString("org.nightlabs.jfire.trade.ui.transfer.deliver.DeliveryQueueBrowsingComposite.button.uncheckAllDeliveries")); //$NON-NLS-1$
popupMenu.add(checkAllAction);
popupMenu.add(uncheckAllAction);
Menu menu = popupMenu.createContextMenu(deliveryTable.getTableViewer().getTable());
deliveryTable.getTableViewer().getTable().setMenu(menu);
JDOLifecycleManager.sharedInstance().addNotificationListener(DeliveryQueue.class, deliveryQueueLifecycleListener);
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event)
{
JDOLifecycleManager.sharedInstance().removeNotificationListener(DeliveryQueue.class, deliveryQueueLifecycleListener);
}
});
refreshDeliveryQueues();
}
private DeliveryQueueConfigModule getDeliveryQueueConfigModule () {
String[] fetchGroups = new String[] { DeliveryQueueConfigModule.FETCH_GROUP_VISIBLE_DELIVERY_QUEUES, DeliveryQueue.FETCH_GROUP_NAME,
DeliveryQueue.FETCH_GROUP_PENDING_DELIVERY_SET, Delivery.FETCH_GROUP_DELIVERY_TABLE_DATA, Article.FETCH_GROUP_ORDER,
LegalEntity.FETCH_GROUP_PERSON, User.FETCH_GROUP_PERSON, FetchPlan.DEFAULT };
DeliveryQueueConfigModule deliveryQueueConfigModule =
ConfigUtil.getUserCfMod(DeliveryQueueConfigModule.class, fetchGroups, -1, new NullProgressMonitor());
return deliveryQueueConfigModule;
}
void deliverCheckedDeliveries() {
final List<Delivery> checkedDeliveries = deliveryTable.getCheckedElements();
if (checkedDeliveries.isEmpty())
return;
AnchorID customerID = null;
for (Delivery delivery : checkedDeliveries) {
if (customerID != null && !delivery.getPartnerID().equals(customerID)) {
MessageDialog.openError(RCPUtil.getActiveShell(), Messages.getString("org.nightlabs.jfire.trade.ui.transfer.deliver.DeliveryQueueBrowsingComposite.dialog.title"), Messages.getString("org.nightlabs.jfire.trade.ui.transfer.deliver.DeliveryQueueBrowsingComposite.dialog.message")); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
customerID = delivery.getPartnerID();
}
final DeliveryQueue selectedDeliveryQueue = printQueueCombo.getSelectedElement();
DeliveryQueueDeliveryWizard deliverWizard = new DeliveryQueueDeliveryWizard(checkedDeliveries, selectedDeliveryQueue);
WizardDialog wizardDialog = new WizardDialog(RCPUtil.getActiveShell(), deliverWizard);
wizardDialog.open();
}
void refreshDeliveryQueues() {
if (refreshing)
return;
refreshing = true;
Job refreshJob = new Job(Messages.getString("org.nightlabs.jfire.trade.ui.transfer.deliver.DeliveryQueueBrowsingComposite.refreshDeliveryQueuesJob.name")) { //$NON-NLS-1$
@Override
protected IStatus run(ProgressMonitor monitor) {
final DeliveryQueueConfigModule pqCfMod = getDeliveryQueueConfigModule();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (!isDisposed()) {
setFaded(true);
// store selection
DeliveryQueue selectedDeliveryQueue = printQueueCombo.getSelectedElement();
// reload delivery queues
List<DeliveryQueue> visibleDeliveryQueues = pqCfMod.getVisibleDeliveryQueues();
Collections.sort(visibleDeliveryQueues, new Comparator<DeliveryQueue>() {
public int compare(DeliveryQueue o1, DeliveryQueue o2) {
return o1.getName().getText().compareTo(o2.getName().getText());
}
});
printQueueCombo.setInput(visibleDeliveryQueues);
// restore selection
if (selectedDeliveryQueue != null) {
printQueueCombo.setSelection(selectedDeliveryQueue);
if (printQueueCombo.getSelectedElement() != null)
deliveryTable.setInput(printQueueCombo.getSelectedElement().getPendingDeliveries());
} else if (!printQueueCombo.getElements().isEmpty()){
printQueueCombo.setSelection(0);
if (printQueueCombo.getSelectedElement() != null)
deliveryTable.setInput(printQueueCombo.getSelectedElement().getPendingDeliveries());
}
setFaded(false);
refreshing = false;
}
}
});
return Status.OK_STATUS;
}
};
refreshJob.setPriority(Job.SHORT);
refreshJob.schedule();
}
void checkAllDeliveries() {
deliveryTable.checkAll();
}
void uncheckAllDeliveries() {
deliveryTable.uncheckAll();
}
// private StoreManager storeManager;
//
// private StoreManager getStoreManager() {
// if (storeManager != null)
// return storeManager;
//
// try {
// storeManager = JFireEjb3Factory.getBean(StoreManager.class, Login.getLogin().getInitialContextProperties());
// return storeManager;
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
// }
}