package org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate; import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.Set; import javax.jdo.FetchPlan; 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.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.PartInitException; import org.eclipse.ui.forms.widgets.Form; import org.nightlabs.base.ui.composite.DateTimeControl; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.job.Job; import org.nightlabs.base.ui.notification.NotificationAdapterSWTThreadAsync; import org.nightlabs.base.ui.notification.SelectionManager; import org.nightlabs.base.ui.resource.SharedImages; import org.nightlabs.base.ui.toolkit.IToolkit; import org.nightlabs.base.ui.util.RCPUtil; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jdo.query.QueryCollection; import org.nightlabs.jfire.store.DeliveryNote; import org.nightlabs.jfire.trade.Article; import org.nightlabs.jfire.trade.ArticleContainer; import org.nightlabs.jfire.trade.LegalEntity; import org.nightlabs.jfire.trade.Offer; import org.nightlabs.jfire.trade.dao.ArticleContainerDAO; import org.nightlabs.jfire.trade.deliverydate.ArticleContainerDeliveryDateDTO; import org.nightlabs.jfire.trade.id.ArticleContainerID; import org.nightlabs.jfire.trade.query.AbstractArticleContainerQuery; import org.nightlabs.jfire.trade.query.DeliveryNoteQuery; import org.nightlabs.jfire.trade.query.OfferQuery; import org.nightlabs.jfire.trade.ui.articlecontainer.detail.ArticleContainerEditor; import org.nightlabs.jfire.trade.ui.articlecontainer.detail.ArticleContainerEditorInput; import org.nightlabs.jfire.trade.ui.resource.Messages; import org.nightlabs.jfire.transfer.id.AnchorID; import org.nightlabs.l10n.IDateFormatter; import org.nightlabs.notification.NotificationEvent; import org.nightlabs.notification.NotificationListener; import org.nightlabs.progress.ProgressMonitor; /** * @author Daniel Mazurek - daniel [at] nightlabs [dot] de * */ public class DeliveryDateComposite extends XComposite { private DateTimeControl dateTimeControl; private DeliveryDateTable deliveryDateTable; private Button onlyCurrentBuisnessPartnerButton; private boolean onlyCurrentBusinessPartner = true; private Set<Class<? extends ArticleContainer>> articleContainerClasses; private Combo typeCombo; private AnchorID selectedLegalEntityID; // private ExpandableComposite advancedFilterComp; private static final String TYPE_OFFER = Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateComposite.type.offer"); //$NON-NLS-1$ private static final String TYPE_DELIVERY_NOTE = Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateComposite.type.deliverynote"); //$NON-NLS-1$ private static final String TYPE_BOTH = Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateComposite.type.both"); //$NON-NLS-1$ /** * @param parent * @param style */ public DeliveryDateComposite(final Composite parent, final int style) { super(parent, style); createComposite(this); } /** * @param parent * @param style * @param layoutMode * @param layoutDataMode */ public DeliveryDateComposite(final Composite parent, final int style, final LayoutMode layoutMode, final LayoutDataMode layoutDataMode) { super(parent, style, layoutMode, layoutDataMode); createComposite(this); } protected void createComposite(final Composite parent) { // final Composite filterCriteriaWrapper = new XComposite(parent, SWT.NONE, LayoutMode.ORDINARY_WRAPPER, // LayoutDataMode.GRID_DATA_HORIZONTAL, 3); final IToolkit toolkit = getToolkit(true); final Form form = toolkit.createForm(parent); form.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); final Composite filterCriteriaWrapper = form.getBody(); filterCriteriaWrapper.setLayout(new GridLayout(3, false)); filterCriteriaWrapper.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Label label = new Label(filterCriteriaWrapper, SWT.NONE); final Label label = toolkit.createLabel(filterCriteriaWrapper, "", SWT.NONE); //$NON-NLS-1$ label.setText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateComposite.label.deliverydate.text")); //$NON-NLS-1$ label.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateComposite.label.deliverydate.tooltip")); //$NON-NLS-1$ dateTimeControl = new DateTimeControl(filterCriteriaWrapper, true, SWT.NONE, IDateFormatter.FLAGS_DATE_SHORT); toolkit.adapt(dateTimeControl); dateTimeControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); dateTimeControl.addSelectionListener(new SelectionAdapter(){ /* (non-Javadoc) * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(final SelectionEvent e) { search(); } }); // Button searchButton = new Button(filterCriteriaWrapper, SWT.FLAT); final Button searchButton = toolkit.createButton(filterCriteriaWrapper, "", SWT.FLAT); //$NON-NLS-1$ searchButton.setImage(SharedImages.SEARCH_16x16.createImage()); searchButton.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateComposite.button.search.tooltip")); //$NON-NLS-1$ searchButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { search(); } }); // advancedFilterComp = new ExpandableComposite(filterCriteriaWrapper, ExpandableComposite.TWISTIE); // advancedFilterComp.setText("Filter Options"); // advancedFilterComp.addExpansionListener(new IExpansionListener(){ // @Override // public void expansionStateChanging(ExpansionEvent e) { // // } // @Override // public void expansionStateChanged(ExpansionEvent e) { // filterCriteriaWrapper.layout(true); // } // }); // Composite wrapper = new XComposite(advancedFilterComp, SWT.NONE); // onlyCurrentBuisnessPartnerButton = new Button(filterCriteriaWrapper, SWT.CHECK); onlyCurrentBuisnessPartnerButton = toolkit.createButton(filterCriteriaWrapper, "", SWT.CHECK); //$NON-NLS-1$ onlyCurrentBuisnessPartnerButton.setSelection(onlyCurrentBusinessPartner); onlyCurrentBuisnessPartnerButton.setText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateComposite.button.onlyCurrentBusinessPartner.text")); //$NON-NLS-1$ onlyCurrentBuisnessPartnerButton.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateComposite.button.onlyCurrentBusinessPartner.tooltip")); //$NON-NLS-1$ onlyCurrentBuisnessPartnerButton.addSelectionListener(new SelectionAdapter(){ /* (non-Javadoc) * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(final SelectionEvent e) { onlyCurrentBusinessPartner = onlyCurrentBuisnessPartnerButton.getSelection(); } }); typeCombo = new Combo(filterCriteriaWrapper, SWT.READ_ONLY); toolkit.adapt(typeCombo); final GridData comboData = new GridData(GridData.FILL_HORIZONTAL); comboData.horizontalSpan = 2; typeCombo.setLayoutData(comboData); typeCombo.setItems(new String[] {TYPE_OFFER, TYPE_DELIVERY_NOTE, TYPE_BOTH}); typeCombo.addSelectionListener(new SelectionAdapter() { /* (non-Javadoc) * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(final SelectionEvent e) { final String text = typeCombo.getText(); articleContainerClasses.clear(); if (text.equals(TYPE_OFFER)) { articleContainerClasses.add(Offer.class); } else if (text.equals(TYPE_DELIVERY_NOTE)) { articleContainerClasses.add(DeliveryNote.class); } else if (text.equals(TYPE_BOTH)) { articleContainerClasses.add(Offer.class); articleContainerClasses.add(DeliveryNote.class); } } }); articleContainerClasses = new HashSet<Class<? extends ArticleContainer>>(); articleContainerClasses.add(Offer.class); typeCombo.select(0); deliveryDateTable = new DeliveryDateTable(parent, SWT.NONE); deliveryDateTable.addDoubleClickListener(new IDoubleClickListener(){ @Override public void doubleClick(final DoubleClickEvent event) { if (deliveryDateTable.getSelectedElements().size() == 1) { final Object selectedObject = deliveryDateTable.getSelectedElements().iterator().next(); if (selectedObject instanceof ArticleContainerDeliveryDateDTO) { final ArticleContainerDeliveryDateDTO dto = (ArticleContainerDeliveryDateDTO) selectedObject; final ArticleContainerID articleContainerID = dto.getArticleContainerID(); try { RCPUtil.openEditor(new ArticleContainerEditorInput(articleContainerID), ArticleContainerEditor.ID_EDITOR); } catch (final PartInitException e) { throw new RuntimeException(e); } } } } }); SelectionManager.sharedInstance().addNotificationListener(LegalEntity.class, selectionListener); addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(final DisposeEvent event) { SelectionManager.sharedInstance().removeNotificationListener(LegalEntity.class, selectionListener); } }); adaptToToolkit(); } private final NotificationListener selectionListener = new NotificationAdapterSWTThreadAsync() { @Override public void notify(final NotificationEvent notificationEvent) { final AnchorID legalEntityID = (AnchorID) notificationEvent.getFirstSubject(); selectedLegalEntityID = legalEntityID; if (onlyCurrentBusinessPartner) { search(); } } }; private void search() { final Display display = Display.getCurrent(); if (display == null) throw new IllegalStateException("Thread mismatch! This method must be called on the UI thread!"); //$NON-NLS-1$ deliveryDateTable.setLoadingMessage(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateComposite.loading.message")); //$NON-NLS-1$ final Date deliveryDate = dateTimeControl.getDate(); final Job job = new Job(Messages.getString("org.nightlabs.jfire.trade.ui.articlecontainer.deliverydate.DeliveryDateComposite.job.search.name")) { //$NON-NLS-1$ @Override protected IStatus run(final ProgressMonitor monitor) throws Exception { if (!isDisposed()){ final QueryCollection<AbstractArticleContainerQuery> articleContainerQueries = new QueryCollection<AbstractArticleContainerQuery>(ArticleContainer.class); for (final Class<? extends ArticleContainer> acClass : articleContainerClasses) { final AbstractArticleContainerQuery query = getQuery(acClass); query.setAllFieldsDisabled(); query.setFieldEnabled(AbstractArticleContainerQuery.FieldName.articleDeliveryDate, true); query.setArticleDeliveryDate(deliveryDate); if (onlyCurrentBusinessPartner) { if (selectedLegalEntityID != null) { query.setFieldEnabled(AbstractArticleContainerQuery.FieldName.customerID, true); query.setCustomerID(selectedLegalEntityID); } } articleContainerQueries.add(query); } // final Collection<?> articleContainers = ArticleContainerDAO.sharedInstance(). // getArticleContainersForQueries(articleContainerQueries, getFetchGroups(), // NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor); final Collection<ArticleContainerDeliveryDateDTO> dtos = ArticleContainerDAO.sharedInstance().getArticleContainerDeliveryDateDTOs( articleContainerQueries, getFetchGroups(), NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor); if (!display.isDisposed()) { display.asyncExec(new Runnable() { public void run() { if (deliveryDateTable.isDisposed()) return; deliveryDateTable.setInput(dtos); } }); } } return Status.OK_STATUS; } }; job.schedule(); } private String[] getFetchGroups() { return new String[] {FetchPlan.DEFAULT, ArticleContainer.FETCH_GROUP_CUSTOMER, LegalEntity.FETCH_GROUP_PERSON, ArticleContainer.FETCH_GROUP_ARTICLES, Article.FETCH_GROUP_END_CUSTOMER}; } private AbstractArticleContainerQuery getQuery(final Class<? extends ArticleContainer> articleContainerClass) { if (Offer.class.isAssignableFrom(articleContainerClass)) { return new OfferQuery(); } else if (DeliveryNote.class.isAssignableFrom(articleContainerClass)) { return new DeliveryNoteQuery(); } return null; } }