package org.nightlabs.jfire.trade.ui.store.search;
import java.util.Collection;
import javax.jdo.FetchPlan;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.base.ui.progress.ProgressMonitorWrapper;
import org.nightlabs.base.ui.table.AbstractTableComposite;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jdo.query.AbstractSearchQuery;
import org.nightlabs.jdo.query.DefaultQueryProvider;
import org.nightlabs.jdo.query.QueryCollection;
import org.nightlabs.jfire.accounting.book.LocalAccountantDelegate;
import org.nightlabs.jfire.accounting.priceconfig.PriceConfig;
import org.nightlabs.jfire.store.ProductType;
import org.nightlabs.jfire.store.ProductTypeGroup;
import org.nightlabs.jfire.store.ProductTypeLocal;
import org.nightlabs.jfire.store.dao.ProductTypeDAO;
import org.nightlabs.jfire.store.deliver.DeliveryConfiguration;
import org.nightlabs.jfire.store.id.ProductTypeID;
import org.nightlabs.jfire.store.search.AbstractProductTypeQuery;
import org.nightlabs.jfire.trade.LegalEntity;
import org.nightlabs.jfire.trade.ui.TradePlugin;
import org.nightlabs.jfire.trade.ui.resource.Messages;
import org.nightlabs.progress.ProgressMonitor;
/**
* @author Daniel.Mazurek [at] NightLabs [dot] de
*
*/
public abstract class AbstractProductTypeSearchComposite
extends XComposite
{
public static final String[] PRODUCT_TYPE_SEARCH_FETCH_GROUPS = new String[] {
FetchPlan.DEFAULT,
ProductType.FETCH_GROUP_THIS_PRODUCT_TYPE,
ProductType.FETCH_GROUP_NAME,
DeliveryConfiguration.FETCH_GROUP_NAME,
LocalAccountantDelegate.FETCH_GROUP_NAME,
ProductTypeGroup.FETCH_GROUP_NAME,
PriceConfig.FETCH_GROUP_NAME,
LegalEntity.FETCH_GROUP_PERSON,
// TODO remove the following fetch-group, because most implementations of ProductType don't support nesting
ProductTypeLocal.FETCH_GROUP_NESTED_PRODUCT_TYPE_LOCALS
};
private AbstractTableComposite<? extends ProductType> productTypeTableComposite;
private Text searchText;
// private ProductTypeSearchCriteriaComposite searchCriteriaComposite;
private Composite searchCriteriaComposite;
/**
* @param parent
* @param style
*/
public AbstractProductTypeSearchComposite(Composite parent, int style) {
super(parent, style);
queryProvider = new DefaultQueryProvider<AbstractSearchQuery>(getResultClass());
AbstractProductTypeQuery productTypeQuery = queryProvider.getQueryOfType(getQueryClass());
// preset the saleable flag.
productTypeQuery.setSaleable(true);
productTypeQuery.setFieldEnabled(AbstractProductTypeQuery.FieldName.saleable, true);
createComposite(this);
}
public AbstractTableComposite<? extends ProductType> getProductTypeTableComposite() {
return productTypeTableComposite;
}
// public ProductTypeSearchCriteriaComposite getSearchCriteriaComposite() {
// return searchCriteriaComposite;
// }
protected void createComposite(Composite parent)
{
Composite criteriaComp = createCriteriaComposite(parent);
ExpandableComposite expandableComposite = createExpandableComposite(parent);
initProductTypeTable(parent);
}
protected void initProductTypeTable(Composite parent) {
productTypeTableComposite = createProductTypeTable(parent);
productTypeTableComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
productTypeTableComposite.addSelectionChangedListener(productTypeSelectionListener);
}
protected Composite createCriteriaComposite(Composite parent) {
Composite criteriaComp = new XComposite(parent, SWT.NONE, LayoutMode.TIGHT_WRAPPER);
criteriaComp.setLayout(new GridLayout(2, false));
criteriaComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label searchLabel = new Label(criteriaComp, SWT.NONE);
searchLabel.setText(Messages.getString("org.nightlabs.jfire.trade.ui.store.search.AbstractProductTypeSearchComposite.searchLabel.text")); //$NON-NLS-1$
createSearchText(criteriaComp);
return criteriaComp;
}
protected Text createSearchText(Composite parent) {
searchText = new Text(parent, SWT.BORDER | SWT.SINGLE);
searchText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
searchText.addSelectionListener(searchTextListener); // this listener doesn't seem to work
searchText.addTraverseListener(new TraverseListener()
{
@Override
public void keyTraversed(TraverseEvent e)
{
if (e.keyCode == SWT.CR)
searchPressed();
}
});
return searchText;
}
protected ExpandableComposite createExpandableComposite(Composite parent) {
ExpandableComposite expandableComposite = new ExpandableComposite(parent, ExpandableComposite.TWISTIE);
expandableComposite.setText(Messages.getString("org.nightlabs.jfire.trade.ui.store.search.AbstractProductTypeSearchComposite.expandableComposite.text")); //$NON-NLS-1$
expandableComposite.setLayout(new GridLayout());
// GridData gridData = new GridData(GridData.FILL_BOTH);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 2;
expandableComposite.setLayoutData(gridData);
searchCriteriaComposite = createSearchCriteriaComposite(expandableComposite);
searchCriteriaComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
expandableComposite.setClient(searchCriteriaComposite);
expandableComposite.addExpansionListener(new ExpansionAdapter()
{
@Override
public void expansionStateChanged(ExpansionEvent e)
{
layout(true, true);
}
});
return expandableComposite;
}
private SelectionListener searchTextListener = new SelectionAdapter()
{
@Override
public void widgetDefaultSelected(SelectionEvent e)
{
searchPressed();
}
};
private ISelectionChangedListener productTypeSelectionListener = new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
StructuredSelection sel = (StructuredSelection) event.getSelection();
selectedProductType = (ProductType) sel.getFirstElement();
}
};
protected String[] getFetchGroups() {
return PRODUCT_TYPE_SEARCH_FETCH_GROUPS;
}
protected abstract Class<? extends ProductType> getResultClass();
protected abstract Class<? extends AbstractProductTypeQuery> getQueryClass();
protected abstract AbstractProductTypeQuery createNewQuery();
public void searchPressed()
{
final String searchStr = searchText.getText();
Job searchJob = new Job(Messages.getString("org.nightlabs.jfire.trade.ui.store.search.AbstractProductTypeSearchComposite.searchJob.name")) { //$NON-NLS-1$
@Override
protected IStatus run(ProgressMonitor monitor) {
Display.getDefault().syncExec(new Runnable() {
public void run()
{
if (productTypeTableComposite != null && !productTypeTableComposite.isDisposed())
productTypeTableComposite.setInput(new String[] {Messages.getString("org.nightlabs.jfire.trade.ui.store.search.AbstractProductTypeSearchComposite.productTypeTableComposite.input_searching")}); //$NON-NLS-1$
}
});
if (queryProvider == null)
throw new RuntimeException("queryProvider must NOT be null at this point of time!"); //$NON-NLS-1$
AbstractProductTypeQuery productTypeQuery = queryProvider.getQueryOfType(getQueryClass());
// productTypeQuery.setSaleable(true);
// productTypeQuery.setFieldEnabled(AbstractProductTypeQuery.FieldName.saleable, true);
// if (searchStr != null && searchStr.trim().length() > 0)
// {
// productTypeQuery.setFullTextSearch(searchStr);
// productTypeQuery.setFieldEnabled(AbstractProductTypeQuery.FieldName.fullTextSearch, true);
// }
configureQuery(productTypeQuery, searchStr);
Collection<ProductTypeID> productTypeIDs;
QueryCollection<?> q1 = queryProvider.getManagedQueries();
QueryCollection<? extends AbstractProductTypeQuery> q = (QueryCollection<? extends AbstractProductTypeQuery>) q1;
productTypeIDs = TradePlugin.getDefault().getStoreManager().getProductTypeIDs(q);
final Collection<ProductType> productTypes = ProductTypeDAO.sharedInstance().getProductTypes(
productTypeIDs,
getFetchGroups(),
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
new ProgressMonitorWrapper(monitor));
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (productTypeTableComposite != null && !productTypeTableComposite.isDisposed()) {
productTypeTableComposite.setInput(productTypes);
if (productTypeTableComposite.getItemCount() == 1) {
productTypeTableComposite.setSelection(new StructuredSelection(productTypes));
productTypeTableComposite.setFocus();
}
}
}
});
return Status.OK_STATUS;
}
};
searchJob.schedule();
}
private ProductType selectedProductType = null;
public ProductType getSelectedProductType() {
return selectedProductType;
}
public void setSearchText(String searchTextString) {
if (searchText != null && !searchText.isDisposed()) {
searchText.setText(searchTextString);
}
}
protected Collection<ProductType> retrieveProductTypes(
QueryCollection<? extends AbstractProductTypeQuery> queries,
ProgressMonitor monitor)
{
Collection<ProductTypeID> productTypeIDs;
productTypeIDs = TradePlugin.getDefault().getStoreManager().getProductTypeIDs(queries);
Collection<ProductType> productTypes = ProductTypeDAO.sharedInstance().getProductTypes(
productTypeIDs,
getFetchGroups(),
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT,
monitor);
return productTypes;
}
private DefaultQueryProvider<AbstractSearchQuery> queryProvider;
// protected ProductTypeSearchCriteriaComposite createSearchCriteriaComposite(Composite parent)
protected Composite createSearchCriteriaComposite(Composite parent)
{
return new ProductTypeSearchCriteriaComposite(parent, SWT.NONE, queryProvider, getQueryClass());
}
protected AbstractTableComposite<? extends ProductType> createProductTypeTable(Composite parent) {
return new ProductTypeTableComposite(parent, SWT.NONE);
}
/**
* @return the queryProvider
*/
public DefaultQueryProvider<AbstractSearchQuery> getQueryProvider()
{
return queryProvider;
}
protected String getSearchText() {
return searchText.getText();
}
protected void configureQuery(AbstractProductTypeQuery productTypeQuery, String searchStr)
{
// // ignore user input on the saleable flag, everything else doesn't make sense!
// // TODO: we should tell the UI to NOT display the saleable flag or make it unmodifiable.
productTypeQuery.setSaleable(true);
productTypeQuery.setFieldEnabled(AbstractProductTypeQuery.FieldName.saleable, true);
if (searchStr != null && searchStr.trim().length() > 0)
{
productTypeQuery.setFullTextSearch(searchStr);
productTypeQuery.setFieldEnabled(AbstractProductTypeQuery.FieldName.fullTextSearch, true);
}
// TODO: FIXME: set vendorID so hat only productTypes of the current vendor can be found
// productTypeQuery.setVendorID()
}
// protected AbstractProductTypeQuery configureQuery(AbstractProductTypeQuery query, String searchStr)
// {
// query.setFullTextSearch(".*"+searchStr+".*"); // Need to pass regex here //$NON-NLS-1$ //$NON-NLS-2$
//
// if (getSearchCriteriaComposite().getSelectedSaleAccessState() != null) {
// SaleAccessStateUtil.applySaleAccessState(
// getSearchCriteriaComposite().getSelectedSaleAccessState(), query);
// }
//
// if (getSearchCriteriaComposite().getSelectedOwnerID() != null)
// query.setOwnerID(getSearchCriteriaComposite().getSelectedOwnerID());
//
// if (getSearchCriteriaComposite().getSelectedProductTypeGroupID() != null)
// query.setProductTypeGroupID(getSearchCriteriaComposite().getSelectedProductTypeGroupID());
//
// // TODO: FIXME: set vendorID so hat only productTypes of the current vendor can be found
// return query;
// }
}